行为型模式设计到算法和对象间的职责分配,不仅描述对象或类的模式,还描述它们之间的通信方式,刻划了运行时难以跟踪的复杂的控制流,它们将你的注意力从控制流转移到对象间的关系上来。行为型类模式采用继承机制在类间分派行为,例如Template Method 和Interpreter;行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组相互对等的对象如何相互协作以完成其中任何一个对象都单独无法完成的任务,如Mediator、Chain of Responsibility、Strategy;其它的行为对象模式常将行为封装封装在一个对象中,并将请求指派给它。
常见行为型模式有11种:CCIIMM(Chain of Responsibility职责链、Command命令、Interpreter解释器、Iterator迭代、Mediator中介者、Memento备忘录),OSSTV(Observer观察者、State状态、Strategy策略、TemplateMethod模版方法、Visitor访问者)。
目标:发送者和接收者之间的耦合,将请求在接收者链上传递,直到该请求被处理。
应用场景:
1) 将请求发送给多个对象中的一个,但不显式指定接收者
2) 多个对象可以处理请求,但预先不知道哪个对象处理哪个请求
3) 处理请求的对象应该被动态设定
优缺点:无法保证请求一定被正确处理
目标:请求封装为对象,以便进行请求的参数化、重做、撤销等操作
应用场景:
1) 业务请求保存在队列中,以备执行
2) 支持业务请求的redo/undo
3) 实现业务行为的参数化
优缺点:有可能造成类爆炸
目标:定义某个语言的语法,用于解释语言中的句子
应用场景:(验证码……)
1) 当某个语言语法较为简单时
2) 解释语言的效率没有严格要求时
优缺点:复杂语法实现困难
目标:在不暴露聚合体对象内部表示的情况下,提供遍历其组成元素的接口
应用场景:
1) 不暴露聚合体内部表示,访问该对象的内容
2) 为聚合体对象提供多种遍历方式
3) 为不同的聚合结构提供统一的访问接口
优缺点:访问聚合对象的私有数据时,可能破坏聚合体的封装特性。
目标:定义一个对象,用来封装一组对象之间交互关系的实现,以降低交互对象显示引用耦合
应用场景:
1) 一组对象以有规律的方式交互,但交互方式复杂
2) 因某个对象引用并且和多个对象交互难以复用
3) 分布在不同类中的某个行为不使用多个子类进行定制
优缺点:仲裁者队对象实现复杂,且维护困难
目标:在不破坏对象封装的情况下,进行对象内部状态的捕捉和外部存储,以便之后用于该对象的状态恢复
应用场景:不破坏对象的封装,捕捉对象的内部状态,当需要时,可用于之后该对象的状态恢复
优缺点:有时,备忘录的对象可能是非常昂贵的。
目标:定义对象之间一对多的依赖关系,当被依赖对象的状态改变时,所有依赖对象能自动收到更新并改变自己
应用场景:(信息订阅功能……)
1) 当一个对象改变时,需要改变其他对象,但不了解其他对象的数量
2) 当一个对象应当负责通知其他对象的职责实现时,降低通知对象和被通知对象之间的耦合
优缺点:被观察对象状态的更新可能会引起观察者级联更新
目标:允许一个对象当内部状态改变时,改变它的行为
应用场景:
1) 一个对象的行为取决于它的状态
2) 因对象状态,该对象的操作含大量的条件分支语句,状态可以由枚举常量代替实现
优缺点:可能需要每个状态子类决定其后继
目标:定义一组算法,单独封装,使得算法能够对使用它的上下文自由变化
应用场景:(数据的显示方式,升序降序等)
1) 一组类只在行为上不同
2) 一个算法需要实现不同的变体
3) 向使用算法的上下文屏蔽算法具体数据结构
优缺点:
1) 客户端对象必须选择具体策略
2) 有可能破坏上下文对象的封装特性
目标:在一个操作中定义算法的框架,将算法中的某些步骤延迟到子类实现
应用场景:
1) 将算法不变的部分一次实现,可变部分由子类实现
2) 控制子类扩展,实现hook方法
优缺点:增加了类的数量
目标:在不改变聚合对象元素类的情况下,可以定义施加在聚合对象元素上的新行为
应用场景:
1) 某聚合对象包含不同接口的元素类型,需要根据不同元素类型,对元素施加不同操作
2) 聚合对象结构极少变化,但常需要定义施加在聚合元素上的行为
优缺点:
聚合对象的元素类型不能变化