C++设计模式:观察者模式<初探>
2017-03-10 13:57
477 查看
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。它还有两个别名,依赖(Dependents),发布-订阅(Publish-Subsrcibe)。可以举个QQ订阅的例子,当QQ订阅号发表新文章的时候,即状态发生了改变,那些订阅的读者就会收到通知,然后进行相应的动作,比如去看文章,或者收藏起来。订阅号与读者之间存在种一对多的依赖关系。
可以看到订阅号类中有一个观察者链表(即订阅者),当订阅号的状态发生变化时,通过Notify成员函数通知所有的观察者,告诉他们订阅号的状态更新了。而观察者通过Update成员函数获取博客的状态信息。代码实现不难,下面给出C++的一种实现。
可以看到订阅号类中有一个观察者链表(即订阅者),当订阅号的状态发生变化时,通过Notify成员函数通知所有的观察者,告诉他们订阅号的状态更新了。而观察者通过Update成员函数获取博客的状态信息。代码实现不难,下面给出C++的一种实现。
/************************************************* Copyright:FZUIM Author:fzuim Date:20170310 Description:C++设计模式:观察者模式头文件 **************************************************/ #ifndef _OBSERVERMODE_H_ #define _OBSERVERMODE_H_ #include <iostream> #include <list> #include <string> using namespace std; //<用户基类Observer //<只包含一个更新操作:Update class Observer { public: Observer(){} virtual ~Observer(){} public: virtual void Update(){} }; //<QQ订阅号基类 //<以下3个接口,理解为官方API,不可覆盖 //<Attach功能:保存订阅者 //<Remove功能:移除订阅者 //<Notify功能:向所有订阅者发送消息 //<以下2个接口,理解为个人订阅号可自定义功能 //<SetInfo功能:设置需要发送的消息内容 //<GetInfo功能:获取消息内容 class QQ { public: QQ(){} virtual ~QQ(){} public: void Attach(Observer* v_pOb); void Remove(Observer* v_pOb); void Notify(); public: virtual void SetInfo(string v_szInfo){m_szInfo = v_szInfo;} virtual string GetInfo(){return m_szInfo;} private: list<Observer*> m_ObserverList; string m_szInfo; }; //<个人订阅号类 //<实现了,设置需要发送的消息内容和获取消息内容 class MyQQ : public QQ { public: MyQQ(string v_szQQ) : m_szQQ(v_szQQ){} ~MyQQ(){} public: void SetInfo(string v_szInfo); string GetInfo(){return m_szInfo;} private: string m_szInfo; string m_szQQ; }; //<个人用户类 //<实现了,将订阅号的消息更新到本地的功能 class MyObserver : public Observer { public: MyObserver(string v_szOb, QQ* v_pQQ){m_szOb = v_szOb; m_pQQ = v_pQQ;} ~MyObserver(){} public: void Update(); private: string m_szOb; QQ* m_pQQ; }; #endif
/************************************************* Copyright:FZUIM Author:fzuim Date:20170310 Description:C++设计模式:观察者模式cpp文件 **************************************************/ #include "ObserverMode.h" void QQ::Attach( Observer* v_pOb ) { m_ObserverList.push_back(v_pOb); } void QQ::Remove( Observer* v_pOb ) { m_ObserverList.remove(v_pOb); } //<向所有订阅者,更新消息 void QQ::Notify() { list<Observer*>::iterator it = m_ObserverList.begin(); for(; it != m_ObserverList.end(); ++it) { (*it)->Update(); } } //<个人订阅号,自定义的特色消息 void MyQQ::SetInfo( string v_szInfo ) { m_szInfo = "QQ Notify: " + m_szQQ + " Update:" + v_szInfo; } //<个人用户,自定义的消息通知 void MyObserver::Update() { string szInfo = m_pQQ->GetInfo(); cout << "--------------------------------------------------" << endl; cout << "| QQ通知 |" << endl; cout << "--------------------------------------------------" << endl; cout << m_szOb << "---" << szInfo << endl; } int main() { QQ* p_QQ = new MyQQ("hdq订阅号"); Observer* p_Ob = new MyObserver("fzuim", p_QQ); p_QQ->Attach(p_Ob); p_QQ->SetInfo("C++ Design Mode:Observer Mode"); p_QQ->Notify(); delete p_QQ; delete p_Ob; system("pause"); return 0; }
相关文章推荐
- <C++ 实现设计模式> 观察者模式
- (Boolan)C++设计模式 <四> ——观察者模式(Observer)
- C++设计模式:简单工厂类模式<初探>
- <C++ 实现设计模式> 观察者模式
- C++设计模式:职责链模式<初探>
- (Boolan)C++设计模式 <十一> ——组合模式(Composite)、迭代器(Iterator)和责任链(Chain of Resposibility)
- (Boolan)C++设计模式 <九> ——单例模式(Singleton)和享元模式(FlyWeight)
- 设计模式-观察者模式(上)<转>
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- C++设计模式--单一对象模式<Singleton>
- <C/C++ 版> 设计模式 学习之 工厂模式 <2>
- (Boolan)C++设计模式 <十> ——状态模式(State)和备忘录(Memento)
- <C/C++ 版> 设计模式 学习之 工厂模式 <1>
- (Boolan)C++设计模式 <十二> ——命令模式(Command)和访问器(Visitor)
- C++设计模式<六>:Decorator装饰模式
- 设计模式总结笔记<四> 观察者模式
- JAVA设计模式(15) —<行为型>观察者模式(Observer)
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- <设计模式>系列汇总 By python and C++
- <C/C++ 版> 设计模式 学习之 策略模式