观察者模式
观察者模式是一种一对多的行为型设计模式,面向的需求是观察者A对B的变化高度敏感,B发生变化时需要及时做出处理。涉及的角色有:
抽象通知者/抽象被观察者(Subject):将任意数量的观察者保存在一个容器中,提供一个接口增删观察者;
具体通知者/具体被观察者(Concrete
Subject):在内部情况发生变化后,向注册过的所有观察者发生通知;
抽象观察者(Observer):定义更新接口,在通知者变化时能够通知自己;
具体观察者(Concrete
Observer):具体实现更新接口,在通知者状态变化时做出处理行为;
特点
通知者/被观察者只有一个,观察者可有多个,观察者关心通知者的变化;
信息传递是单向的,通知者发送消息,观察者接受信息;
信息通过类似回调函数的机制进行传输,通知者状态变化调用更新函数,无需观察者定期轮询;
缺点:
通知者逐个调用观察者函数接口,当对象很多时通知效率和实时性变低;
当观察者和观测目标存在循环依赖,系统无法正常使用;
观察者模式没有机制表明观察对象具体的变化,只是知道对象发生变化。
模式实例
通知者状态变化:通知"老板来了",两个观察者做出相应的变化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #include <iostream> #include <vector> using namespace std;
class NotifierBase; class ObserverBase{ protected: string name; NotifierBase* nof; public: ObserverBase(string name,NotifierBase* nof):name(name),nof(nof){} virtual void Update() = 0; };
class NBAObserver:public ObserverBase{ public: NBAObserver(string name,NotifierBase* nof):ObserverBase(name,nof){} virtual void Update(); };
class StockObserver:public ObserverBase{ public: StockObserver(string name,NotifierBase* nof):ObserverBase(name,nof){} virtual void Update(); };
class NotifierBase{ public: string action; vector<ObserverBase*>vp; void Join(ObserverBase* ob){ vp.push_back(ob); } virtual void Notify() = 0; };
class SpyNotifier:public NotifierBase{ public: void Notify(){ for(auto i:vp){ i->Update(); } } };
void NBAObserver::Update(){ cout<<nof->action<<"不要看NBA"<<endl; }
void StockObserver::Update(){ cout<<nof->action<<"不要看股票"<<endl; }
int main(){ NotifierBase *spy = new SpyNotifier(); ObserverBase *nba_person = new NBAObserver("Eden",spy); ObserverBase *stock_person = new StockObserver("Mike",spy);
spy->Join(nba_person); spy->Join(stock_person);
spy->action = "老板来了";
spy->Notify();
return 0; }
|
参考链接: C++设计模式——观察者模式