观察者模式学习
来源:互联网 发布:思科网络切换 编辑:程序博客网 时间:2024/04/28 13:13
1. 将数据和“数据的视图”进行分离,保持两者之间的低耦合。
2. “数据类”保持独立性,“视图类”依赖“数据类”
3. “数据类”中维护所有视图实例的引用(顶级父类引用),“视图类”中维护所依赖的数据实例的引用。
4. 数据发生更新时数据实例根据“视图类”所提供的接口,执行更新操作。
#include <iostream>#include <vector>using namespace std;class Subject { vector <class Observer* > views; /* observer 父类指针 */ int value;/* 数据 */ public: void attach(Observer *obs) { views.push_back(obs); } void setVal(int val)/* 更新数据,同时通知观察者读取数据 */{ value = val; notify(); } int getVal() { return value; } void notify();};class Observer { Subject *model; /* 指针指向观察者所依赖的“数据”实例 */ int denom; public: Observer(Subject *mod, int div){ model = mod; denom = div; model->attach(this);/* 将自己加入到“数据”所维护的观察者集合中 */ } virtual void update() = 0; /* 数据读取方式由具体子类进行实现 */ protected: /* 以下方法客户没法进行访问 */ Subject* getSubject() { return model; } int getDivisor() { return denom; }};void Subject::notify() {for (int i = 0; i < views.size(); i++)views[i]->update(); /* 不同的观察者有不同的数据读取方式,此处为多态,update()是父类方法 */}/* 不同观察者的具体实现 */class DivObserver: public Observer { public: DivObserver(Subject *mod, int div): Observer(mod, div){} void update() { int v = getSubject()->getVal(), d = getDivisor(); cout << v << " div " << d << " is " << v / d << '\n'; }};class ModObserver: public Observer { public: ModObserver(Subject *mod, int div): Observer(mod, div){} void update(){ int v = getSubject()->getVal(), d = getDivisor(); cout << v << " mod " << d << " is " << v % d << '\n'; }};int main() { Subject subj; DivObserver divObs1(&subj, 4); DivObserver divObs2(&subj, 3); ModObserver modObs3(&subj, 3); subj.setVal(14);}
0 0
- 模式学习:观察者模式
- 观察者模式学习A
- 观察者模式学习B
- 学习日记-观察者模式
- 观察者模式学习
- 观察者模式学习
- 观察者模式学习笔记
- 观察者模式-HeadFirst学习
- 观察者模式巩固学习
- 观察者模式学习
- 观察者模式学习
- Observer:观察者模式学习
- 观察者模式学习笔记
- 观察者模式学习总结
- 观察者模式的学习
- 观察者模式学习
- 设计模式学习--观察者模式
- 设计模式学习----观察者模式
- SQL 视图机制
- java.lang.ClassNotFoundException: javax.persistence.Cacheable
- dialog对话框按钮添加监听器
- 数据结构——算法之(018)( 和为n连续正数序列)
- hdu 1864 最大报销额
- 观察者模式学习
- float double精度和范围
- 第十二周作业
- uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型 - 大总结
- OCP 1Z0 051 125
- 异常详细信息: System.Data.SqlClient.SqlException: 必须声明标量变量 "@MsgID"。
- 最爱雨季
- 自定义的scene用initWithPhysics初始化出现的问题
- Android基础--Activity的四种launchMode