上篇博客给大家介绍了六大原则和设计模式之间的关系,以及创建型模式和结构型模式
(http://blog.csdn.net/zhangzijiejiayou/article/details/32712779)。本文将给大家介绍行为型模式。
是对在不同的对象之间划分职责和算法的抽象化。
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到
通知并被自动更新。
优点:在解耦合,让耦合的双方都依赖于抽象的接口而不是具体,从而使各自的变化都不会影响另一边的变化。
依赖倒转原则的最佳体现。
缺点:抽象观察者的接口的任务过于繁重。运用时要把握好这个尺度。
模板方法:定义一个操作算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构
即可重新定义该算法的某些特定步骤。
优点:提供了一个很好的代码复用的平台。很好地体现了开放封闭原则和里氏代换原则。
缺点:算法骨架不容易升级
模板方法可以用桥接模式模拟实现
命令模式:将一个请求封装为一个对象,从而使你可用不同的的请求对客户进行参数化;可以对请求排队或记录
请求日志,以及支持可撤销的操作。
优点:将调用操作的对象和知道如何实现该操作的对象解耦
缺点:用来执行操作的接口的任务比较繁重。
状态模式:允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类。
优点:与特定状态相关的行为局部化,并且将不同状态的行为分割开来,状态模式通过把各种状态转移逻辑分布
到State的子类之间,来减少相互间的依赖
状态模式和策略模式在模式结构图上基本上是一样的
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成
一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
优点:接收者和发送者都没有对方明确的消息,且链中的对象自己也并不知道链的结构。降低了耦合度。
缺点:一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。
职责链和命令模式都可以将请求的发送者和接收站之间解耦合,但执行方式不同。
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使该表示来解释语言中
的句子。
优点:容易改变和扩展文法,因为该模式使用类来表示文法法则,可以使用继承来改变或扩展文法。也比较容易
实现文法,因为定义抽象语法树中各个节点的类的实现大题类似,这些类都易于直接编写。
缺点:包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编
译生成器来处理。
中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦
合松散,而且可以独立地改变他们之间的交互。
优点:降低了类之间的耦合,关注的对象从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更
宏观的角度去看待系统。
缺点:交互复杂性变为中介者的复杂性
访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以再不改变各元素的类的前提下定义作用
于这些元素的新操作。
优点:数据结构和作用于结构上的操作之间的耦合度降低
缺点:增加新的数据结构变得困难。
策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。本模式使得算法可独立于使
用它的客户变化。
优点:定义了一系列的可重用的算法或行为,继承有助于析取这些算法中的公共功能。简化了单元测试。
缺点:并没有解除客户端需要需要判断的压力。
策略模式和简单工厂模式结合可以大大减轻客户端的职责。
桥接模式和策略模式
相同:某些情况下,可以使用桥接模式来模拟实现策略模式的功能。
不同:最主要的是模式的目的不一样,策略模式的目的是封装一系列的算法,使得这些算法可以相互替换;而桥
接模式的目的是分离抽象部分和实现部分,使得它们可以独立地变化。
备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样可将该
对象恢复到原先保存的状态。
优点:可将该对象恢复到原先保存的状态。
缺点:如果状态数据很大很多,会非常消耗内存
命令模式和备忘录模式结合可以使用备忘录模式来存储可撤销操作的状态。
迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
优点:为遍历不同的聚集结构提供如开始、下一个、是否结束、当前那一项等统一接口。分离了集合对象的遍历
行为,抽象出一个迭代器类来负责,这样既可以不暴露集合内部结构,又可让外部代码透明地访问集合内部的数据。
个人小结:
只要真正深入地理解了设计原则,很多设计其实就是原则的而已,或许在不知不觉中就在使用设计模式了。亦或
我们可以再根据设计模式的基本原则设计出更好的更实用的模式来。就像《倚天屠龙记》中张无忌练习武当派武功的
最高境界就是“全忘记”,其实设计模式的最高境界也是这样,应用于无形当中。
原文地址:http://blog.csdn.net/zhangzijiejiayou/article/details/33292579