行为型模式(Behavioral Pattern)
-
定义:关注系统中对象之间的交互,研究系统在运行时对象之间的相互通信与协作,进一步明确对象的职责
- 行为型模式:不仅仅关注类和对象本身,还重点关注它们之间的相互作用和职责划分
-
分类:
- 类行为型模式:使用继承关系在几个类之间分配行为,主要通过多态等方式来分配父类与子类的职责
- 对象行为型模式:使用对象的关联关系来分配行为,主要通过对象关联等方式来分配两个或多个类的职责
命令模式
-
定义:将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
- 对象行为型模式
- 别名为动作(Action)模式或事务(Transaction)模式
- “用不同的请求对客户进行参数化”
- “对请求排队”
- “记录请求日志”
- “支持可撤销操作”
-
简单结构:4个角色
- Command(抽象命令类)
- ConcreteCommand(具体命令类)
- Invoker(调用者)
- Receiver(接收者)
-
UML:
-
优缺点:
- 优点:
- 降低系统的耦合度
- 新的命令可以很容易地加入到系统中,符合开闭原则
- 可以比较容易地设计一个命令队列
- 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案
- 缺点:
- 使用命令模式可能会导致某些系统有过多的具体命令类(针对每一个对请求接收者的调用操作都需要设计一个具体命令类)
- 优点:
-
适用环境:
- 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互
- 系统需要在不同的时间指定请求、将请求排队和执行请求
- 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作
- 系统需要将一组操作组合在一起形成宏命令
迭代器模式
-
定义:提供一种方法顺序访问一个聚合对象中各个元素,且不用暴露该对象的内部表示。
- 对象行为型模式
- 又名游标(Cursor)模式
- 通过引入迭代器,客户端无须了解聚合对象的内部结构即可实现对聚合对象中成员的遍历,还可以根据需要很方便地增加新的遍历方式
-
简单结构:4个角色
- Iterator(抽象迭代器)
- ConcreteIterator(具体迭代器)
- Aggregate(抽象聚合类)
- ConcreteAggregate(具体聚合类)
-
UML:
-
优缺点:
- 优点:
- 支持以不同的方式遍历一个聚合对象,在同一个聚合对象上可以定义多种遍历方式
- 简化了聚合类
- 由于引入了抽象层,增加新的聚合类和迭代器类都很方便,无须修改原有代码,符合开闭原则
- 缺点:
- 在增加新的聚合类时需要对应地增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性
- 抽象迭代器的设计难度较大,需要充分考虑到系统将来的扩展。在自定义迭代器时,创建一个考虑全面的抽象迭代器并不是一件很容易的事情
- 优点:
-
适用环境:
- 访问一个聚合对象的内容而无须暴露它的内部表示
- 需要为一个聚合对象提供多种遍历方式
- 为遍历不同的聚合结构提供一个统一的接口,在该接口的实现类中为不同的聚合结构提供不同的遍历方式,而客户端可以一致性地操作该接口