摘要: 概述 虽然并不完全符合,命令模式给我的感觉有点像数据库中的中间表。中间表将两个实体表的主键作为外键,将两个实体表关联成多对多的关系。同样命令模式中命令对象就好像中间表一样,将动作的引发者和动作的执行者关联起来,引发者无需知道执行者,执行者也无需了解是谁引发了这个动作。如果仔细想想,动作的引发者和动作的执行者之间也是多对多的关系。下面是GOF给出的意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 这局意图的前半句,个人感觉有些描述得过于抽象,这里仅供参考;后半句怎说明了命令模式的的一些应用场景和用途: 1、... 阅读全文
posted @ 2012-09-25 15:15 宽厚 阅读(1390) 评论(0) 推荐(1) 编辑
摘要: 概述访问者模式不是一个很常用的模式,首先来看GOF《设计模式》给出的意图描述。表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。由这段意图描述,可以看出访问者模式的主要用途就是现有的类附加职责,而且这些现有的类处于一个继承树中。我们定义这样的术语:“现有的类”称为“被访问类”,包含附加行为的类称为“访问者”。使用访问者模式要求,被访问类比较稳定,而需要扩展的行为比较易变,这样通过模式将扩展行为分离出去,才可以获得比好的效果;相反如果被访问类易变,那么当被访问类增减时,都要对与之有关的所有访问者类进行修改,因此此时使用此模式不是很合适,详见 阅读全文
posted @ 2012-09-21 17:29 宽厚 阅读(1381) 评论(1) 推荐(0) 编辑
摘要: 概述 先从面向对象的三大特征之一封装说起。面向对象的封装简单点说就是把状态(数据)和行为(操作这些数据的方法)放到一起,构成一个单元,通常叫做类。一个对象的行为是事先确定好的(静态)一些脚本,如果对象的状态相同,对象看起来就是一样的。所以当我们需要把一个对象的某一时刻保存起来,那么只需要保存它在那个时刻的状态;相反需要恢复对象到某一时刻时,只需恢复它在那个时刻的状态。这就是备忘录模式的原理。 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 上面是GOF对备忘录模式的意图描述,非常清楚,内部状态保存到外部,再从... 阅读全文
posted @ 2012-09-14 10:59 宽厚 阅读(1688) 评论(1) 推荐(1) 编辑
摘要: 概述 初次听到职责链这个名词,你或许会有一种高深莫测的感觉,我当时就是这样。但如果深入的看下去,发现职责链还真是顾名思义,就是一系列具有相同职责的对象构成一个对象链,由这个对象链去处理一个请求。发出请求的客户端只需知道这个链可以处理这个请求,无需知道这个链的构成和排列。照例给出GOF的意图描述: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 职责链模式有两个要点: 1、存在多个请求的接收者; 2、多个接收者依次处理请求,此处包含了顺序的要求; 3、具体由哪个或哪些接收者处理这... 阅读全文
posted @ 2012-09-11 15:56 宽厚 阅读(1415) 评论(9) 推荐(1) 编辑
摘要: 概述 在进行面向对象编程时,我们通常根据经验将领域抽象成大大小小,各种层次的对象。一般情况下这样没有什么问题,但如果某些表示细节的对象非常繁多、成千上万,直接构造这么多的对象就会产生严重的性能问题甚至无法实现。因此我们需要想出某种办法来解决这个问题,可能的一种方式就是通过共享,减少对象的创建,用GOF的话来说就是。 运用共享技术有效地支持大量细粒度的对象。 上面就是享元模式的意图。想要使用享元模式,面对的问题需要: 1、使用大量的对象,并且这些对象造成了大量的开销; 2、对象的状态可以分为内部状态和外部状态;如果去除外部状态,这些对象可以缩减为较少的数目; 3、由于需要共享... 阅读全文
posted @ 2012-09-10 17:12 宽厚 阅读(1267) 评论(2) 推荐(1) 编辑
摘要: 概述 组合模式大概是每个人都用过的一种模式,或有心,或无意。因为如果要把一个一个的节点组合成“树”,组合模式的写法应该是比较自然的一种表达。但是个体与整体的访问一致性,可能需要特别注意一下。先看看GOF给出的模式意图。 将对象组合成树形结构以表示“部分-整体”的层次结构,使用户对单个对象和组合对象的使用具有一致性。 也是就是说: 1、组合模式用来构建“部分-整体”的层次结构,也就是树; 2、客户端对象使用对象个体和对象的组合体时,方法相同。 组合模式的实现过程中有一些值得考虑的地方,下节将详述。 结构 下面是组合模式的类图: 整理一下模式参与者(为了表述清楚,将使... 阅读全文
posted @ 2012-09-07 16:54 宽厚 阅读(1396) 评论(2) 推荐(0) 编辑
摘要: 概述 工作中,我们经常需要创建一组对象,这组对象相互相关或者依赖,形成一个系列,系列中的对象不能与其他系列中的对象混用。为系列中的每种对象建立工厂可以满足对象创建的需求,但是无法保证它们是同一系列的。这时引入抽象工厂模式可以解决上面的问题。下面是GOF给出的抽象工厂模式的意图。 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 抽象工厂的优点: 1、客户端不依赖具体实现类,符合依赖倒置的OO原则; 2、可以生成一系列的对象,生成不同的系列的切换比较方便,同时也可以保证一致性; 但是如果在新的系列中增加新类型,将会引发所有工厂类的修改。 如果注意观察,会... 阅读全文
posted @ 2012-09-05 16:54 宽厚 阅读(939) 评论(0) 推荐(0) 编辑
摘要: 概述 说起原型模式,一般理解就是“克隆”一个对象,因此经常被人忽视。前两天看了一篇博文还有博文后面的讨论(http://www.cnblogs.com/winter-cn/archive/2009/12/02/1614987.html),并参考了GOF的解释,对原型模式有了一点新的体会。 GOF关于原型模式的意图是这样描述的: 用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 这句话有两个子句,前一个说新对象的类型与原型对象的一致(用原型实例指定);后一个说创建新对象的方法是拷贝(克隆操作)。我们常常忽略的是第一个子句,既原型模式如何确定新建对象的类型。用通俗的说... 阅读全文
posted @ 2012-09-04 16:21 宽厚 阅读(1419) 评论(6) 推荐(1) 编辑
摘要: 概述 状态模式是一种比较常用的设计模式,属于GOF23种设计模式中行为模式的一种。 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 上面是《设计模式——可复用面向对象软件基础》一书中给出的这个模式的意图。通俗一点说就是一个对象具有多种状态,在每个状态下,对象的行为(代码逻辑)不同。对于简单的情况我们可以用if…else…或者swich语句来处理这中情况,不过当状态复杂多变,而且每个行为都因状态的不同而大不相同时,可以考虑引入状态模式来化解危机。 状态模式将每个状态和与其相关的行为封装的单独的类中,因此很容易添加新的状态;对象的状态很容易转换,可以避免在... 阅读全文
posted @ 2012-09-02 16:43 宽厚 阅读(1031) 评论(0) 推荐(1) 编辑
摘要: 有些基础知识很早就学习过了,但可能当时理解不深刻,或者工作中没有应用到,以致渐渐淡忘了。这个系列就是对这些淡忘知识的一个复习,也希望复习的同时可以加深理解,故取名温故知新。概述装饰者模式是GOF23种设计模式的一个,属于结构型的设计模式。主要意图是:动态的给一个对象添加一些额外的职责。“动态”和“给一个对象”的表述说明了这种“添加额外职责”是在运行期决定的,而不是由静态的父子类继承实现。因此应用装饰着模式提供了较大的灵活性,由组合替代了继承,避免了子类的数量上的爆炸。下面引用了一个论坛帖子(http://bbs.m.the9.com/forum.php?mod=viewthread&t 阅读全文
posted @ 2012-08-31 17:21 宽厚 阅读(1691) 评论(5) 推荐(4) 编辑