行为型设计模式
行为型设计模式涉及到算法和对象间职责的分配。不仅描述对象或类的模式,还描述它们之间的通信模式。
行为型设计模式有以下11种:
- 责任链(Chain of Responsibility)
- 命令(Commad)
- 解释器(Interpreter)
- 迭代器(Iterator)
- 中介者(Mediator)
- 备忘录(Memento)
- 观察者(Observer)
- 状态(State)
- 策略(Strategy)
- 模板方法(Template Method)
- 访问者(Visitor)
责任链(Chain of Responsibility)
- 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。通俗理解就是,有多个不同优先级的对象可以处理请求,使用链表的形式可以方便增加删除对象,自动调整优先级。侧重点在于动态调整,模块解耦。
- 例子:窗口各个控件响应一次键盘输入请求。
- 优点:降低耦合、增加动态分配的灵活性。
- 缺点:请求可能会没有对象处理。
设计模式-责任链.jpg
命令(Commad)
- 意图:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。通俗理解就是,实现回调函数的面向对象版本,其中用对象代替回调函数,多个回调函数则用多个子类实现。侧重点在于回调机制,模块解耦。
- 例子:剪切板的实现,同样的内容粘贴到不同的位置有不同的效果。
- 优点:请求与响应解耦、易于控制和扩展。
- 缺点:要仔细考虑请求者与响应者之间的职责分配。
设计模式-命令.jpg
解释器(Interpreter)
- 意图:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。通俗理解就是,将高频发生的特定类型问题转换成一种语言,并实现一个树型的文法解释器。侧重点在于问题转化成语言。
- 例子:正则表达式解决字符串匹配问题。
- 优点:易于改变、扩展和实现文法。
- 缺点:复杂文法无法管理、效率低。
设计模式-解释器.jpg
迭代器(Iterator)
- 意图:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。通俗理解就是,将元素的遍历操作单独封装到一个对象中,实现功能解耦。侧重点在于功能解耦。
- 例子:C++迭代器。
- 优点:支持多种方式遍历、支持并行遍历、简化接口。
- 缺点:需要充分考虑增删时迭代的健壮性。
设计模式-迭代器.jpg
中介者(Mediator)
- 意图:用一个中介对象来封装一系列对象的交互。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。通俗理解就是,将分布式结构转换成星形结构。侧重点在于对象间访问解耦。
- 例子:增加一个管理者类使窗口的各个控件类解耦。
- 优点:减少子类生成、简化对象协议、对象间访问解耦。
- 缺点:中介者的复杂性大,可能难以维护。
设计模式-中介者.jpg
备忘录(Memento)
- 意图:在不破坏封装性的前提下,捕获一个对象的内部状态。并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。通俗理解就是,将对象状态在外部保存下来实现完全恢复。侧重点在于备份还原。
- 例子:实现撤销功能、系统还原。
- 优点:保持封装不被破坏、简化备份对象的实现。
- 缺点:使用的代价可能很高、开销大。
设计模式-备忘录.jpg
观察者(Observer)
- 意图:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。通俗理解就是,增加中间转发类将分布式结构变成星形结构,实现消息收发解耦。侧重点在于模块解耦。
- 例子:MQTT 发布-订阅机制。
- 优点:消息发送者和接受者解耦、支持广播机制。
- 缺点:可能会出现意外的更新。
设计模式-观察者.jpg
状态(State)
- 意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。通俗理解就是,将状态机实现为多个子类,每个子类对应一种状态。侧重点在于子模块拆分。
- 例子:实现TCP连接。
- 优点:容易增加新的状态和转换、使转换显式化。
- 缺点:管理state对象较为复杂。
设计模式-状态.jpg
策略(Strategy)
- 意图:定义一系列的算法,把它们一个一个封装起来,并且使它们可以相互替换。使得算法可独立于使用它的客户而变化。通俗理解就是,将多个switch分支对应一个子类,方便替换。侧重点在于子模块拆分。
- 例子:提供多种内存管理算法,用户根据实际需要配置。
- 优点:消除一些条件语句、方便客户选择和裁剪。
- 缺点:增加了对象和通信开销。
设计模式-策略.jpg
模板方法(Template Method)
- 意图:定义一个操作中的算法的骨架将一些步骤延迟到子类中。使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通俗理解就是,将可变部分定义为虚函数并只允许外部访问不可变的成员函数。侧重点在于提取公共行为。
- 例子:几乎可以在所有基类见到。
- 优点:提供父类动态调用子类的方法。
- 缺点:可变部分过多会导致子类冗长。
设计模式-模板方法.jpg
访问者(Visitor)
- 意图:表示一个作用于某对象结构中的各元素的操作。使得可以在不改变各元素的的类的前提下定义作用于这些元素的新操作。通俗理解就是,通过传递this指针,自定义新操作。侧重点在于集中代码。
- 例子:给每个类增加白盒测试用例,集中代码到一个测试类,可以避免将测试代码分散到各个类中。
- 优点:易于增加新操作、按功能集中代码。
- 缺点:可能会累积状态、常常会破坏封装、增加新子类困难。
设计模式-访问者.jpg
行为型设计模式小结
- 待补充