一、什么是观察者模式
观察者模式是一种非常普遍又很实用的开发设计模式,c++不像其他高级语言一样有现成的标准封装库,所以在c++语言中只能开发者自己来设计出一种观察者模式。从技术上来说,一个正确“观察者”是一个比较复杂的设计过程。
在观察者设计模式结构中有两种基本角色,观察者和被观察者;被观察者和观察者是一对多的关系,简单来说就是一个被观察者可以被多个观察者监听。当被观察者中有信号变化时就会通知那些观察者这种信号的变化,这样观察者就能在不轮询的情况下依然能实时了解到所关注信号的变化。具体的对应关系如下图所示:
二、观察者模式的使用场景
1, 当一个对象的信号变化需要被多个其他对象所知道的时候,但是又不清楚有多少个其他对象是关注这种信号变化的,此时就适合用观察者模式来设计逻辑
2,当某一个复杂的功能需要多个类对象来共同完成的时候,为了不让这些类相互循环包含调用耦合在一起,用观察者模式就非常有利于模块间的合作解耦。
三、观察者模式的实现
3-1:普通观察者模式实现
- ObserverBase(观察者基类): 这是一个抽象类,提供一个update的纯虚函数,为所有继承该类的具体观察者提供一个通用的接口,通过update接口能拿到最新的消息数据
- SubjectBase(主题 基类): 这是一个抽象类,该类提供三个纯虚函数 (消息注册接口Subsribe 和、消息注销接口UnSubsribe、通知接口Notify)。继承该类的具体主题实现这三个接口,并且可以管理消息ID和观察者的关系。有需要更新的事件时通过Notify来通知注册过该消息的观察者。
- ConcreteObserver(具体业务的观察者):实现update这个纯虚接口,通过这个接口获取实时更新的数据,然后实现具体的业务逻辑。
- ConcreteSubject(具体的消息主题): 实现SubjctBase中的纯虚函数,并且将消息ID和观察作者做一个订阅绑定。当有业务消息需要通知观察者时,通过Notify来通知对应的观察者对象。
基本框图如下:
实现代码如下:
#include <list>
#in