0x00 引言
设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,之所以记录这些模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。重要的参考文献为设计模式-可复用的面向对象软件元素[1],以及菜鸟教程[2]上收录的一些成熟的设计模式。本文将根据菜鸟教程上的设计模式分类方式书写,且只针对创建型模式,全部代码基于c++。
0x01 观察者模式
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。
订阅-发布模式是由观察者模式衍生出来的,前者新增了第三个组件,称为调度中心或事件通道,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者。
1 | 1 观察者模式 |
1、观察者模式
观察者模式有两个重要的角色,即目标和观察者,在目标和观察者之间是没有事件通道的。一方面,观察者要想订阅目标事件,由于没有事件通道,因此必须将自己添加到目标(Subject) 中进行管理;另一方面,目标在触发事件的时候,也无法将通知操作(notify) 委托给事件通道,因此只能亲自去通知所有的观察者。
1 |
|
2、订阅-发布模式
发布-订阅模式是面向调度中心编程的,只需要写一个类专门用于控制信息的发布。其优点在于去中心化,即不在乎谁是发布者,而且能管理多个事件。
1 |
|
0x02 状态模式
1 | 1 理论基础 |
1、理论基础
状态模式的概念和有限状态机相似。最容易想到的状态机实现应该就是if else语句,实现起来类似这样:
1 | if ("status1" == state) { |
但是当状态变得很多,并且状态之间的耦合度变得很高时,这种代码就会很难维护。状态模式就是为了解决这个问题而产生的,一个最简单的状态模式,其UML图如下:
1.Context - 上下文。定义一个与使用者交互的接口。可以用该对象来记录当前状态。
2.State - 所有状态的父类。其虚函数定义状态之间发生转换时的行为。
3.ConcreteState - 继承自State的状态子类。有选择地实现State中定义的行为。
2、具体实现
现在我们假设需要做一个状态机,其状态关系如下图:
上下文 context.hpp:
1 |
|
状态类头文件 state.h:
1 |
|
状态类实现 state.cpp:
1 |
|
具体调用 main.cpp:
1 | /*状态模式的实现.*/ |
0x03 引用文献
[1]https://baike.baidu.com/item/设计模式:可复用面向对象软件的基础/7600072
[2]https://www.runoob.com/design-pattern/design-pattern-intro.html