定义
当有一系列的对象都依赖某个特定对象的状态改变时,我们就可以使用观察者模式。观察者的框架如下:
根据上面框架可知,观察者模式在目标的主题对象和依赖对象(观察者)之间定义一个一对多的关系。当目标主体对象的状态发生变化时,依赖的对象将自动更新/通知。
具体实现
为了实现观察者模式,主题对象主要需要做如下几个操作:
- 定义了一个统一的观察者对象实例描述结构体
一个观察者对象实例描述结构体通常需要包括观察者对象的名称和对应的操作接口。通常采用链表的形式连接所有的观察者对象,所以对应的描述结构体也需要包含链表的前后指针。另外,我们的观察者对象有时候只有在一定条件下才通知,因此描述结构体中通常也会包含相应的判断条件。一个观察者对象实例描述结构体例子如下:
- 提供观察者注册函数
观察者需要提供一个统一的注册函数,这样任何需要加入观察者的业务模块都可以调用。常见的注册函数形式如下:
- 状态变化时通知到所有观察者
当主题状态发生变化时,将通知到所有的观察者。观察者本身也可以设置条件,只有在满足一定条件时才选择接受通知。相关的流程示例如下:
模式优点
观察者模式可以有效简化主流程通知逻辑,而且后续如果需要新增观察者的话只需要实例化对象并注册即可,不需要改动主流程逻辑,提高了系统的稳定性。