设计模式之行为模式
《设计模式:可复用面向对象软件的基础》第五章 行为模式
一、CHAIN OF RESPONSIBILITY(职责链)
1.意图
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2.适用情况
- 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
- 你想在不明确指定接收者的情况下,想多个对象中的一个提交一个请求。
- 可处理一个请求的对象集合应被动态指定。
3.结构
4.相关模式
职责链常与Composite一起使用。这种情况下,一个构件的父构件可作为它的后继。
二、COMMAND(命令)
1.意图
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
2.适用情况
- 回调。Command模式是回调机制的一个面向对象的替代品。
- 在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接受者可用一种与地址空间无关的方式表达,那么就可将负责该qian求的命令对象传送给另一个不同的进程并在哪儿实现该请求。
- 支持取消操作。Command的Excute操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。
- 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。
- 用构建在原语操作上的高层操作构造一个系统。
3.结构
4.相关模式
Composite模式可被用来实现宏命令。
Memento模式可用来保持某个状态,命令用这一状态来取消它的效果。
在被仿如历史表列前必须拷贝的命令起到一阵难过原型的作用。
三、INTERPRETER(解释器)
1.意图
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
2.适用情况
当有一个一样需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
3.结构
4.相关模式
Composite模式:抽象语法树是一个符合模式的实例。
Flyweight:说明了如何在抽象语法树中共享终结符。
Iterator:解释器可用一个迭代器遍历该结构。
Visitor:可用来在一个类中维护抽象语法树中的各节点的行为。
四、ITERATOR(迭代器)
1.意图
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。
2.适用情况
- 访问一个聚合对象的内容而无需暴露它的内部表示。
- 支持对聚合对象的多种遍历。
- 为遍历不同的聚合结构提供一个统一的接口。
3.结构
4.相关模式
Composite:迭代器常被应用到像复合这样的递归结构上。
Factory Mehtod:多态迭代器靠Factory Mehtod来例化适当的迭代器子类。
Memento:常与迭代器一起使用
五、MEDIATOR(中介者)
1.意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2.适用情况
- 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结果混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。、
3.结构
4.相关模式
Facade 与中介者的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即Facade对象对这个子系统类提出请求,但 反之则不行。相反,Mediator提供了各Colleague对象不支持或不能支持的协作行为,而且协议是多向的。
COlleague可使用Observer模式与Mediator通信。
六、MEMENTO(备忘录)
1.意图
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可就将该对象恢复到原先保存的状态。
2.适用情况
- 必须保存一个对象在某一个时刻的(部分)状态,这样以后需要时它才能恢复到先前的状态。
- 如果一个用接口来让其他对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
3.结构
4.相关模式
Command:命令可使用备忘录来为可撤销的操作维护状态。
Iterator:备忘录可用于迭代。
七、OBSERVER(观察者)
1.意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并被自动更新。
2.适用情况
- 当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
- 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,你不希望这些对象是紧密耦合的。
3.结构
八、STATE(状态)
1.意图
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
2.适用情况
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一 个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。 State模式将每一个条件分支放入一个独立的类中。这使得你可以更车对象自身的情况将对象的状态作为一个状态,这一状态可以不依赖于其他对象而独立变 化。
3.结构
4.相关模式
Flyweight模式解释了何时以及怎样共享状态对象。
状态对象通常是Singleton。
九、STRATEGY(策略)
1.意图
定义一些列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立与使用它的客户而变化。
2.适用情况
- 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
- 需要使用一个算法的不同变体。
- 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
3.结构
4.相关模式
Flyweight:Strategy对象经常是很好的轻量级对象。
十、TEMPLATE METHOD(模板方法)
1.意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结果即可重定义该算法的某些特定步骤。
2.适用情况
- 一次实现一个算法的不变部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应该别提取出来并集中到一个公共父类中以避免代码重复。
- 控制子类扩展。模板方法只在特定点调用“hook”操作,这样就只允许在这些点进行扩展。
3.结构
4.相关模式
Factory Method模式:常被模板方法调用。
Strategy:模板方法使用继承改变算法的一部分。
十一、VISITOR(访问者)
1.意图
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用与这些元素的新操作。
2.适用情况
- 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些地下实施一些依赖于其具体类的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构别很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
- 定义对象结构的类很少改变,但是经常需要在此结构上定义新的操作。改变地下结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
3.结构
4.相关模式
Composite:访问者可以用于对一个由Composite模式定义的对象结构进行操作。
Interpreter:访问者可以用于解释。
十二、行为模式总结
1.封装变化
封 装变化是很多行为模式的主题。当一个程序的某个方面的特征经常发生改变时,这些模式就定义一个封装这个方面的对象。这样当该程序的其他部分依赖于这个方面 时,它们都可以与此对象协作。这些对象通常定义一个抽象类来描述这些封装变化的对象,并且通常该模式依据这个对象来命名,例如,
- 一个Stragegy对象封装一个算法。
- 一个State对象封装一个与状态相关的行为。
- 一个Mediator对象封装对象间的协议。
- 一个Iterator对象封装访问和遍历聚集对象中的各个构件的方法。
2.对象作为参数
一些模式引入总是被用作参数的对象。例如Visitor。
其他模式定义一些可作为令牌到处传递的对象,这些对象将在稍后被调用。Command和Memento都属于这一类。
3.通信应该被封装还是被分布
Mediator和Observer是相互竞争的模式。它们之间的差别是,Observer通过引入Observer和Subject对象来分布通信,而Mediator对象则封装了其他对象间的通信。
4.对发者和接收者解耦
命令模式使用一个Command对象来定义一个发送者和接收者之间的绑定关系,从而支持解耦。
观察者模式通过定义一个接口来通知目标中发生的改变,从而将发送者(目标)和接收者(观察者)解耦。
中介者模式让对象通过一个Mediator对象的间接的互相引用,从而对它们解耦。
职责链模式通过沿一个潜在接收者链传递请求而将发送者与接收者解耦。