博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式(Observer Pattern)
阅读量:4701 次
发布时间:2019-06-09

本文共 3243 字,大约阅读时间需要 10 分钟。

观察者模式(Observer Pattern) —— 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

观察者模式可以理解为发布-订阅模式,即多个订阅者(观察者)向发布者(被观察者)订阅状态信息,当发布者更新状态时会将状态信息向它的订阅者发布信息。发布者需要自己维护订阅者列表,可以注册或者注销对状态信息感兴趣或不感兴趣的订阅者。

// subject.h#include
#include
using namespace std;typedef int State;class Observer;// 被观察者(发布者)抽象class Subject {public: Subject(){} virtual ~Subject(){} virtual void Attach(Observer* obv); // 注册观察者 virtual void Detach(Observer* obv); // 注销观察者 virtual void Notify(); // 通知观察者 virtual void SetState(const State& st) = 0; virtual State GetState() = 0;private: //观察者列表 vector
m_pObs;};// 被观察者(实际发布者)class ConcreteSubject: public Subject{public: ConcreteSubject(){} ~ConcreteSubject(){} State GetState(); void SetState(const State& st);private: State m_state;};
// subject.cpp#include "subject.h"#include "observer.h"void Subject::Attach(Observer* pObs){    m_pObs.push_back(pObs);}void Subject::Detach(Observer* pObs){    vector
::iterator it = m_pObs.begin(); for ( ;it!=m_pObs.end();++it) { if (*it == pObs) { m_pObs.erase(it); return; } }}void Subject::Notify(){ vector
::iterator it = m_pObs.begin(); for ( ; it!=m_pObs.end(); ++it) { (*it)->update(this); }}void ConcreteSubject::SetState(const State& st){ m_state = st;}State ConcreteSubject::GetState(){ return m_state;}
// observer.h#include
#include
#include
using namespace std;typedef int State;class Subject;// 观察者抽象class Observer {public: Observer(){} virtual ~Observer(){} virtual void update(Subject* sub) = 0; virtual void outputState();protected: string m_name; State m_observerState;};// 实际观察者Aclass ConcreteObserverA: public Observer {public: ConcreteObserverA(string name, State init_state){ m_name = name; m_observerState = init_state; } ~ConcreteObserverA(){} void update(Subject* sub);private:// Subject* m_sub;};// 实际观察者Bclass ConcreteObserverB: public Observer {public: ConcreteObserverB(string name, State init_state){ m_name = name; m_observerState = init_state; } ~ConcreteObserverB(){} void update(Subject* sub);private:// Subject* m_sub;};
// observer.cpp#include "observer.h"#include "subject.h"void Observer::outputState(){    cout<
<<" update state :"<
<
GetState(); outputState();}void ConcreteObserverB::update(Subject* sub){ m_observerState = sub->GetState(); outputState();}
// main.cpp#include "observer.h"#include "subject.h"int main(){    ConcreteSubject* subject = new ConcreteSubject();    Observer* obA = new ConcreteObserverA("observerA", -1);    Observer* obB = new ConcreteObserverB("observerB", -1);    subject->Attach(obA);    subject->Attach(obB);    subject->SetState(0);    subject->Notify();    subject->Detach(obA);    subject->SetState(1);    subject->Notify();    delete obA;    delete obB;    delete subject;    return 0;}// 输出结果://observerA update state :0//observerB update state :0//observerB update state :1

转载于:https://www.cnblogs.com/s-lisheng/p/11332767.html

你可能感兴趣的文章
数据结构化与保存
查看>>
Linux shell 命令判断执行语法 ; , && , ||
查看>>
vim代码格式化插件clang-format
查看>>
RTP Payload Format for Transport of MPEG-4 Elementary Streams over http
查看>>
Java环境变量设置
查看>>
【JBPM4】判断节点decision 方法3 handler
查看>>
filter 过滤器(监听)
查看>>
node启动时, listen EADDRINUSE 报错;
查看>>
杭电3466————DP之01背包(对状态转移方程的更新理解)
查看>>
kafka中的消费组
查看>>
python--注释
查看>>
SQL case when else
查看>>
SYS_CONTEXT 详细用法
查看>>
Pycharm配置autopep8让Python代码更符合pep8规范
查看>>
我的第一篇博客
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>