观察者模式(observer pattern)
2015-08-17 18:46
274 查看
观察者模式:
定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。
结构图:
![](http://images0.cnblogs.com/blog2015/565026/201508/171832530972000.jpg)
C++实现:
观察者模式涉及到的一个设计原则是:松耦合设计。改变subject或observer其中一方,并不会影响另一方。只要它们之间的接口仍被遵守,我们就可以自由地改变它们。
PS:
观察者模式的一个例子是MVC,现在没接触到,先这样吧。。。
定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。
结构图:
![](http://images0.cnblogs.com/blog2015/565026/201508/171832530972000.jpg)
C++实现:
class Observer; class Subject { public: virtual void attach(Observer *o) = 0; virtual void detach(Observer *o) = 0; virtual void notify() = 0; }; class Observer { public: virtual void update(int val) = 0; }; class mySubject : public Subject { private: set<Observer*> obs; int value; public: void attach(Observer *o) { obs.insert(o); } void detach(Observer *o) { obs.erase(o); } void setVaule(int val) { value = val; notify(); } void notify() { set<Observer*>::iterator it; for (it = obs.begin(); it != obs.end(); ++it) { (*it)->update(value); } } int getValue() { return value; } }; class observerA : public Observer { private: int value; Subject *psj; public: observerA(Subject *p): psj(p) { psj->attach(this); } void update(int val) { value = val; display(); } void display() { printf("current value: %d\n", value); } ~observerA() { delete psj; } }; class observerB : public Observer { private: Subject *psj; public: observerB(Subject *p): psj(p) { psj->attach(this); } void update(int val) { if (val > 0) printf("good news\n"); else printf("bad news\n"); } ~observerB() { delete psj; } }; int main() { mySubject subj; observerA a(&subj); observerB b(&subj); subj.setVaule(1); subj.detach(&a); subj.setVaule(2); }
观察者模式涉及到的一个设计原则是:松耦合设计。改变subject或observer其中一方,并不会影响另一方。只要它们之间的接口仍被遵守,我们就可以自由地改变它们。
PS:
观察者模式的一个例子是MVC,现在没接触到,先这样吧。。。
相关文章推荐
- 单口RAM、伪双口RAM、双口RAM与FIFO的区别
- android优化(一)---App调试内存泄露之Cursor篇
- Android ScrollView如何设置maxHeight
- 所有技术都是遵循最基本的原理
- 布局解决方案之多列布局
- 所有技术都是遵循最基本的原理
- unity编辑器扩展
- SPOJ 题目375 Query on a tree(link cut tree边权更新,求两点最大值)
- 在Centos 6.3 X64平台安装11.2.0.1时,Hang到65%不动
- java 网络编程
- ASCII、Unicode、GBK和UTF-8字符编码的区别联系
- vc对话框全屏
- hdu 1003 Max Sum
- maskView 配合 CAGradientLayer 的使用
- 8.18android工程的结构及其五大布局
- amCharts在网页上绘制各种图形[转]
- 技术就是一层窗户纸-于无声处看大神
- Cocos2d-x实现Android的Toast特征
- 括号匹配
- 技术就是一层窗户纸-于无声处看大神