行为模式涉及到算法和对象间职责的分配,行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻划了在运行时难以跟踪的复杂的控制流,将程序员的注意力从控制流转移到对象间的联系方式上来。
职责链(chain of responsibility)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
![](http://img.blog.csdn.net/20140807100206546)
Handler:定义一个处理请求的接口,实现后继链
ConcreteHandler:处理它所负责的请求;可访问它的后继者;如果可处理请求就处理,否则将请求转给后继者
命令(command)
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
![](http://img.blog.csdn.net/20140807101218125)
Command:声明执行操作的接口
ConcreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute
Client:创建一个具体命令对象并设定它的接收者
Invoker:要求该命令执行这个请求
Receiver:知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者
不好理解哈,再记录下具体的协作过程:
- client创建一个ConcreteCommand对象并指定它的Receiver对象
- 某Invoker对象存储该ConcreteCommand对象
- 该Invoker通过调用Command对象的Execute操作来提交一个请求,若该命令是可撤销的,ConcreteCommand就在执行Execute操作之前存储当前状态以用于取消该命令
- ConcreteCommand对象调用receiver的一些操作以执行该请求
![](http://img.blog.csdn.net/20140807103544975)
解释器(Interpreter)
给定一个语音,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
![](http://img.blog.csdn.net/20140807110306925)
AbstractionExpression:声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
TerminalExpression:实现与文法中的终结符相关联的解释操作;一个句子中的每个终结符需要该类的一个实例
NonterminalExpression:对文法中的每一条规则R::=R1R2...Rm都需要一个NonterminalExpression;为从R1到Rn的每个符号都维护一个AbstractExpression类型的实例变量;为文法中的非终结符实现解释操作,解释一般要递归地调用表示R1到Rn的那些对象的解释操作
Context:包含解释器之外的一些全局信息
迭代器(iterator)
提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示
![](http://img.blog.csdn.net/20140808101926779)
Iterator:迭代器定义访问和遍历元素的接口
ConcreteIterator:具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置
Aggregate:聚合定义创建相应迭代器对象的接口
ConcreteAggregate:具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。ConcreteIterator跟踪聚合中的当前对象,并能够计算出待遍历的后继对象
中介者(mediator)
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
Mediator:中介者定义一个接口用于与各Colleague对象通信
ConcreteMediator:具体中介通过协调各Colleague对象实现协作行为,了解并维护它的各个同事
Colleague:每一个Colleague都知道它的中介者对象,每一个Colleague对象在需与其他Colleague通信时,与它的中介者通信
同事向一个中介者对象发送和接收请求,中介者在各同事间适当地转发请求以实现协作行为
备忘录(memento)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态
Memento:备忘录存储原发器对象的内部状态,原发器根据需要决定备忘录存储原发器的哪些内部状态;防止原发器以外的其他对象访问备忘录
Originator:原发器创建一个备忘录,用以记录当前时刻它的内部状态;使用备忘录恢复内部状态
Caretaker:负责保存好备忘录,不能对备忘录的内容进行操作或检查
观察者(observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
Subject:目标知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册和删除观察者对象的接口
Observer:为那些在目标发生改变时需获得通知的对象定义一个更新接口
ConcreteSubject:将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知
ConcreteObserver:维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与目标的状态保持一致;实现observer的更新接口以使自身状态与目标的状态保持一致
状态(state)
允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类
Context:定义客户感兴趣的接口,维护一个ConcreteState子类的实例,这个实例定义当前状态
State:定义一个接口以封装与Context的一个特定状态相关的行为
ConcreteState:每一个子类实现一个与Context的一个状态相关的行为
策略(strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换,本模式使得算法可独立于使用它的客户而变化
Strategy:定义所有支持的算法的公共接口,Context使用这个接口来调用某ConcreteStrategy定义的算法
ConcreteStrategy:以Strategy接口实现某具体算法
Context:用一个ConcreteStrategy对象来配置,维护一个对Strategy对象的引用,可定义一个接口让Strategy访问它的数据
模板方法(template method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
AbstractClass:定义抽象的原语操作(primitive operation),具体的子类将重定义它们以实现一个算法的各步骤;实现一个模板方法,定义一个算法骨架,该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作
ConcreteClass:实现原语操作以完成算法中与特定子类相关的步骤
访问者(visitor)
表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作
Visitor:为该对象结构中ConcreteElement的每一个类声明一个visit操作。
ConcreteVisitor:实现每个由visitor声明的操作
Element:定义一个Accept操作,以一个访问者为参数
ConcreteElement:实现Accept操作,该操作以一个访问者为参数
ObjectStructure:能枚举它的元素,可以提供一个高层的接口以允许该访问者访问它的元素,可以是一个复合或是一个集合