设计模式学习2

《深入浅出设计模式(C#/JAVA版)》

4.1。 Adapter

将一个接口转换成客户想要的另外一个接口,使得接口不兼容的那些类可以一起工作。

优势:在不能或不想修改接口的情况下适用

缺陷:客户调用可能需要变动

应用情境:

1。对象需要利用现存的并且接口不兼容的类。

2。你需要创建可重用的类,以协作其他接口不一定兼容的类。

3。你需要使用若干个现存的子类,但是又不想派生这些子类的每一个接口。

4.2。桥接模式

将抽象部分与实现部分分离,使得两部分可以独立变化。

优势:减少类的数目,代码简洁,程序更小

缺陷:抽象类与实现类的双向连接使得运行速度减慢

应用情境:

1。避免抽象方法和其实现方法绑定在一起

2。抽象接口和它的实现都需要扩展出子类备用。

3。变动实现的方法不会影响客户程序调用部分

4.3。组合模式(composite pattern)

组合多个对象形成树形结构,以表示整体-部分的结构层次。其中,组合类定义子部件;叶部件中没有子节点,定义原接口对象的行为。

优势:对于树结构的控制有着神奇的功效,例如在人力资源系统的组织架构及ERP系统的BOM设计中,组合模式得到重点应用

缺陷:式设计变得更加抽象。对象的商业规则如果很复杂,实现有很大挑战性。而且,不是所有方法都与叶子部件类有关联。

应用情境:

1。表示一个对象整体或部分层次

2。想让客户能够忽略不同对象的层次变化

3。对象的结构是动态的而且复杂程度不一样,但客户需要一致地处理它们

4.4。装饰模式(decorator pattern)

动态给一个对象增加其他职责(比生成子类实现更加灵活)

优势:比静态继承更好,不需要改变原来的代码。

注意:装饰链不适宜过长,影响效率。

劣势:对象接口发生变化,所有装饰类都要变化

应用情境:

1。透明+动态给对象增加新的方法,而不影响其他对象。

2。新增的方法在未来会发生改变

3。子类扩展不实际的情况下。

4.5。 外观模式(Facade pattern)

提供统一的借口去访问多个子系统的多个不同接口。定义了一个高层次的接口,使得子系统容易被使用。

优势:提供了简单+公用的接口处理复杂的子系统,没有减少子系统功能。遮蔽了系统复杂性,避免client与子系统直接接触;减少了子系统之间的连接

劣势:限制了客户自由,减少了可变性

应用情境:

1。需要复杂的子系统提供一个简单的接口

2。客户与抽象的实现类中存在若干依赖

3。子系统分层是必要的

4.6。轻量级模式(Flyweight pattern)

运用共享技术,有效支持大量细粒度对象。系统只使用少量对象,而这些对象都相近。状态变化很小,对象使用次数增多。

实例:四国军棋程序。使用flyweight模式避免为每个棋子创建一个对象,只要将一个棋子对象画在不同地方并存储是哪种棋子就可以了。军旗应用程序只需要保存棋子及其所在的位置,画在屏幕的工作交给一个棋子对象完成。

优势:需要你认真考虑如何细化对象,减少处理对象的数量,减少对象在内存和设备中的占有量

劣势:需要维护大量对象的外部状态,使传递、查找、计算变得复杂。当外部和内部状态分不清的时候,不建议使用。

应用情境:

1。系统需要存在大量的对象而共享某些本质的、不变的信息

2。对象可以同时用于多个环境下。

3。在每个实例中,flyweight可以作为一个独立的对象。

4.7。代理模式(proxy pattern)

为其他对象提供一个代理或地方,以控制对这个对象的访问。当客户第一次向proxy对象提出请求的时候,proxy实例化真实对象,并且将请求转发。以后所有的客户请求都经由proxy转发给封装了的真实对象。

优势:掩蔽对象由网络生成的过程;对于大图片的加载,可以让加载在后台进行;验证对真实对象的引用权限

劣势:请求处理速度会变慢

应用情境:

1。virtual proxy。不会生成真实的耗费代理,首次有请求的时候。

2。remote proxy。本地的代理对象控制一个远程对象。

3。protection proxy。代理检查调用真实对象所需要的权限。

4。smart reference。当调用真实对象时,代理处理另外一些事,例如,计算引用次数,首次引用时装存留的的对象,访问时检查真是对象是否锁定

Chap5 Behavioral design patterns

5.1。责任链模式(chain of responsibility)

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,知道有对象处理它为止。

举例:采购分级审批

具体做法:简历责任个体实例,然后在之间建立关系,例如上下级,父子关系。

优势:允许把一组类当做一个类来使用,并且在类的组合里,一个类的事件可以发送到另一个类来处理。通常应用在图形用户界面上。还会以树状出现(缺点是信息在树中容易迷失)

应用情境:

1。超过一个对象能够处理客户请求并且到底哪个对象处理与预先不知道。

2。一个请求可以发布到多个对象但它的接收都是不清晰的

3。可以动态指定一组对象处理请求。

5.2。命令模式(command pattern)

将一个请求封装成一个对象,因此可以参数化多个客户的不同请求,将请求排队,记录成日志,并支持撤消操作。

举例:餐馆订餐

优势:分离对象,使已存在的保持不变,是新增加类的工作更简单; 分离用户界面和业务对象

劣势:类的数量增加爱,系统复杂,调试困难

应用情境:

1。需要与动作有关的对象作为参数

2。需要在不同时间创建请求,生成请求队列,并执行

3。需要支持取消、保存、修改日志或处理事务功能。

4。需要支持宏命令。

5.3。解释器模式(interpreter pattern)

定义一个解释器,用它来解释使用这种语言的句子。

优势:改变和扩展文法变得容易,实现文法也变得简单明了,很多遍一齐,包括文本编辑器、网页浏览器、VRML都应用了解释器模式

劣势:文句会分析成树结构,解析器需要递归访问它,影响了效率

应用情境:

1. 语言的文法需要扩展

2. 程序效率不太重要

5.4  迭代器模式(Iterator Pattern)

提供一种方法可以访问聚合对象,而不用暴露这个对象的任何内部表示。

优势:支持在聚合中移动游标,封装了聚合的对象;还可以应用于树结构,程序不需要从头逐行代码查找相应的位置,可控制到从子集开始查找,加快程序的运行速度。

劣势:和聚合密切相关,增加了耦合。把这种狗和定义在抽象基类可以解决这个问题

应用情境:

1. 需要遍历访问聚集中的对象而不能暴露聚集的内部结构。

2. 允许对聚集的多级遍历访问而不会相互受影响。

3. 提供一个一致的接口来遍历访问聚集中不同的结构。

 

5.5 中介者模式 Mediator Pattern

定义一个对象封装一系列多个对象如何相互作用。Mediator使对象之间不需要显示地相互引用,从而使其耦合更加松散,并且还让我们可以独立变化多个对象相互作用。

优势:分离了同事类,简化了对象协议,不需要传递数据给其他个体对象,仅仅传给中介就可以了。个体对象不需要具有处理内部交流的逻辑

劣势:

应用情境:

1。一组对象复杂地相互通信但其方法是定义明确的。

2。若干个对象需要定义方法又不需要子类实现。

该模式通常用在基于通信的系统结构上,信息传递到关联的对象,自身不直接连接。

 

5.6 备忘录模式 Memento Pattern

在不破坏一个对象封装的前提下,获取一个对象的状态,以将来可以恢复这个状态。

caretaker只能调用功能受限的接口——只能传递memento给其他对象;原发器可以调用一个功能强大的接口,通过这个接口可以访问所有需要的数据,使原发器可以返回先前的状态。

在实现上,C++可以用friend,Java/c#需要将Originator和memento放在同一个包/域内。

优势:保存了封装的边界。简化了Originator对象。Memento用堆栈保持Originator对象,可以实现多次取消对象。

劣势:

应用情境:

1。对象状态的备忘可以完全恢复到原来的状态。

5.7 观察者模式 Observer Pattern

定义对象间的一种一对多依赖关系,使每当一个对象改变状态,则其相关依赖对象都得到通知并更新。

优势:提供了广播式的对象间通信,并且容易增加新的观察者对象。

劣势:对象间的关系难以理解,在某些情况下会表现低效能。

应用情境:

1。对一个对象的变化请求需要其他对象也变化,并且其他要变化对象的数量不明确

2。一个对象需要通知其他对象而不需要掌握其他对象的识别方法。

 

5.8 状态模式 State Pattern

当一个对象的内在状态改变时允许改变其行为。这个对象看起来像改变了其类。

优势:使状态变化变得清晰明了,也容易创建对象的新状态。

劣势:

应用情境:

在工作流或游戏等各种系统中大量使用,例如在政府OA中,一个批文的状态有多种。一个网络游戏中,游戏活动的状态有开始、开玩、正在玩、输赢等。使用状态模式可以实现游戏状态的总控,而游戏状态决定了游戏的各个方面。

1。对象的行为依赖于它的状态,并且它必须可以根据它的状态而改变它的行为。

2。操作很多部分都带有与对象状态有关的大量条件语句。

 

5.9 策略模式 Strategy pattern

定义一系列算法,将每一个算法封装起来,并让他们可以相互替换。策略模式让算法独立于使用它的用户而变化。

优势:提供了替代派生的子类,并定义类的每个行为,提出了代码中条件判断语句,使扩展变得容易。

劣势:

应用情境:

1。多个类的分别只在于行为不同。

2。需要对行为的算法作很多变动。

3。客户不知道算法要使用的数据。

 

5.10 模板方法模式 Template Method Pattern

定义一个操作中算法的骨架,以将一些步骤延缓到子类中实现,模板方法让子类重新定义一个算法的某些步骤而无需改变算法的结构。

优势:在子类定义处理算法时不会改变算法的结构。每个不同的实现都需要定义一个子类。

劣势:

应用情境:

1。想将相同的算法放在一个类中,算法变化部分放在子类中实现。

2。子类公共的算法应该放在一个公共的类中,避免代码重复。

 

5.11  访问者模式 Visitor Pattern

说明一个操作执行与一个对象结构的成员中,访问者样式让你定义一个类的新的操作而无须改变它操作的这些成员类。

优势:使增加新的操作变得容易,可以收集有关联的方法,分离没有关联的方法,特别适用于因为不同原因而变化的事物。

劣势:常常要打破对象封装性。visitor与element需要达成某种共识。

应用情境:

1。一个对象的结构包含多个不同接口的对象,并且需要根据具体对象作不同的处理。

2。对结构中的对象有很多不同而且没有联系的处理,因此需要避免操作将类分离。

3。类中定义的对象结构很少改变,但你需要经常滴定仪处理结构的新操作。

——————

觉得这本书写得还算清楚了,比起很多设计模式的书,讲得好多了。不过我没看过原版的GoF,只看过配套原版的一本解释的书。

但是比起以下这个:http://www.cnblogs.com/lovecherry/category/108156.html,这本书的文字叙述显然就比不上它通俗易懂。

posted @ 2010-10-24 07:59  irischan  阅读(305)  评论(0编辑  收藏  举报