大话设计—行为型模式总结

【行为型】用于封装行为的变化。识别对象之间的常用交流模式并加以实现。如此,可在进行这些交流活动时增强弹性。

行为型模式包括:职责链模式、命令模式、解释器模式、迭代模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式

1.职责链模式:将对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。职责链可简化对象的相互连接,它们仅需保持一个指向后继者的引用,而不需要保持所有候选者的引用,链中对象不用知道链的结构,接受者和发送者都没有对方的明确信息。可以通过在运行时刻动态的增加或修改链来动态的改变处理一个请求的职责;不能保证请求一定被接受,一个请求也可能因链没有被正确配置而得不到处理。

 效果:当客户提交一个请求时,请求沿着链传递直至有一个ConcreteHandler对象负责处理它或者到链末。

2.命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。和很多设计模式一样,命令模式在你的请求和处理之间加上了一个中间人的角色,来达到分离耦合的目的。

 效果:将调用操作的请求对象和知道如何实现操作的接受对象解耦;具体命令角色可被不同的请求者角色重用,它可将多个命令装配成一个复合命令,增加新的具体命令角色无需改变已有的类。

3.解释器模式:定义语言(使用规定格式和语法的代码)的文法,并且建立一个解释器来解释该语言中的句子。它提供一种简单方法来执行语法且容易修改和扩展。一般系统中很多类使用相似的语法,可以使用一个解释器来代替每一个规则实现一个解释器。

 效果:在解释器中不同规则是由不同类实现的,从而使添加一个新的语法规则简单化,但对于复杂语法难以维护。

4.迭代器模式:提供一种方法顺序访问一个集合中各个元素,而又不暴露该对象的内部表示。

 效果:在软件构建过程中,集合对象内部结构常常变化各异,但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素,同时这种“透明遍历”也为“同一种算法在多种集合对象上进行操作”提供了可能。

5.中介者模式:用一个中介对象封装一系列的对象交互。中介者使各对象间不需要显式的相互引用,从而使其松散耦合,而起可以独立的改变它们之间的交互。

 特别注意:中介者模式在结构上和观察者模式、命令模式相似,而应用目的与外观模式相似。在结构上,中介者模式与观察者模式和命令模式都添加了中介对象——只是中介模式去掉了后两者行为上的方向。但观察者模式中的观察者、命令模式中的命令都是被客户所知的,具体哪个观察者、应用都是由客户来指定的,而大多中介者角色对客户是透明的,造成这种区别的原因是它们要达到的目的不同。从目的上看,命令模式与外观模式相似;但外观模式是介于客户程序与子系统之间的,而中介者模式是介于子系统与子系统之间的;前者将复杂的逻辑提取出一个统一的接口,简化客户对逻辑的使用,而后者的加入并没有改变客户原有的使用习惯,它是隐藏在原有逻辑后面的,使得代码逻辑更加清晰可用。中介者模式最大的好处是将同事角色解耦,简化原有系统的通信协议——将原有的多对多变为一对多,提高了代码的可复用性。在使用中介者模式时要注意控制中介者角色的大小。

6.备忘录模式:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以后可将该对象恢复到原先保存的状态。

 效果:在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯到对象之前处于某个点时的状态,如果使用一些公有接口来让其他对象得到对象的状态,便会暴露对象的细节实现。

7.观察者模式:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

 效果:将一个系统分割成一个一些类相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的。

8.状态模式:对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为

 效果:当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

9.策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可相互替换,本模式使得算法可独立于使用它的客户而变化。

 理解:策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

10.模板方法模式:在一个方法里定义算法的骨架,将一些步骤延迟到其子类。

 效果:通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。模板方法模式把我们不知道具体实现的步骤封装成抽象方法,提供一个按正确顺序调用它们的具体方法(这些具体方法统称为“模板方法”),这样构成一个抽象基类。子类通过继承这个抽象基类去实现各个步骤的抽象方法,而工作流程却由父类控制。

11.访问者模式:表示以作用于对象结构中各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

 效果:目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。

【总结】

到现在为止完成了设计模式的总结,其中接触最多的就是面向对象的思想。

从大话设计模式这本书中学到了:设计模式是如何体现面向对象泛型的,而且每个设计模式都对“为什么以这种方式设计?”作了回答。
从中可以体会到的【面向对象泛型的原则】:
1.对象是具有明确定义的责任的事物。
2.对象对自己负责。
3.封装是对代码等信息的隐藏。
4.使用共性和可变性分析抽象出行为和数据的变化。(可以实现责任的分解)
5.多借助接口实现操作。
6.将变化归到一个类中,并与类中的其他变化解耦。
7.力求低耦合、强内聚。
8.实现使用一个对象的代码与创建一个对象的代码分离。



posted @ 2014-12-09 19:01  幻想泡沫  阅读(178)  评论(0编辑  收藏  举报