行为模式设计算法和对象间指责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了再运行时难以追踪的、复杂的控制流。
行为类设计模式使用继承机制在类间分派行为。
行为对象模式使用对象复合而不是继承。
1:责任链模式(Chain of Responsibility)
意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
实用性:
有多个的对象可以处理一个请求 ,哪个对象处理该请求运行时刻自动确定。
想在不明确指定接收者的情况下向多个对象中的一个提交一个请求。
可处理一个请求的对象集合应被动态指定。
2:命令(Command)
意图:将一个请求封装为一个对象,从而使得可以用不同的请求对客户端进行参数化。对请求排队或者记录请求日志,以及支持可撤销操作。
适用性:
抽象出待执行动作以参数化某对象
在不同的时刻指定、排列和执行请求
支持取消操作
支持修改日志
用构建在原语操作上的高层操作构造一个系统
3:解释器(Interpreter)
意图:给定一个语言,定义他的文法中的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
适用性:
该文法简单,对于复杂的发文,文法的类层次变得庞大而无法管理。
效率不算是一个关键问题。最高效的解释器通常不是通过直接解释语法分析数实现的,而是将他们转化成另一种形式。
4:迭代器(Iterator)
意图:提供一个方法顺序访问一个聚合对象中的各个元素,且不需要暴露该对象的内部表示。
适用于:
访问一个聚合对象的内容而无需暴露它的内部表示
支持对聚合对象的多种遍历
对遍历不同的聚合结构提供一个统一的接口
5:中介者(Mediator)
意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间地交互。
适用性:
一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
想定制一个分布在很多个类中的行为,而用不想生成太多的子类。
6:备忘录(Memento)
意图:在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,这样以后可以将对象恢复到原先保存的状态。
实用性:
必须保存一个对象在某一个时刻的状态,这样以后需要时它才能恢复到先前的状态
如果一个接口来让其他对象直接得到了这些状态,将会暴露对象的实现细节并破坏对象的封装性。
7:观察者(Observer)
意图:定义对象间的一种一对一的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。
适用于:
当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用。
当一个对象地改变需要同时改变其他对象时,而不知道具体有多少对象有待改变时。
当一个对象必须通知其他对象,而它又不能嘉定其他对象是谁,即不希望这些对象时紧耦合的。
8:状态(State)
意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类
适用于:
一个对象的行为决定于它的状态,并且它必须在运行时刻根据状态改变它的行为。
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态常用一个或多个枚举常量表示。
9:策略模式(Strategy)
意图:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户端而变化。
适用于:
很多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。例如,定义一些反映不同空间的空间/时间权衡算法。
算法使客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为,并且这个行为在这个类的操作中以多个条件语句的形式出现,将相关的条件分支移入它们各自的策略类中,以代替这些条件语句。
10:模板方法(Template Method)
意图:定义一个操作中对的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
适用于:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并机中到一个公共符类中,以避免代码重复。
控制子类扩展。模板方法旨在特定点调用“HOOK”操作。
11:访问者(Visitor)
意图:表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素对的新操作。
适用于:
一个对象结构包含很多类对象,它们有不同的接口,而用户对这些对象实施一些依赖于其具体类的操作。
需要对一个对象结构中的对象进行很多不同的并且不想管的操作,而又想避免这些操作“污染”这些对象的类。
定义对象结构的类很少改变,但经常需要在次结构上定义新的操作。