观察者模式
来源:互联网 发布:软件测试英文自我介绍 编辑:程序博客网 时间:2024/06/07 11:17
一,原理
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个对象。这个对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
二,解决的问题
将一个系统分成一系列相互协作的类有一个很不好的副作用,就是这些类紧密耦合在一起,这为后期的扩展与维护都带来很大的不方便。观察者模式的关键,就是可以保持对象的独立性,解除对象之间的耦合,使原来具有依赖关系的对象依赖于抽象,而不是依赖于具体的类对象。
三,何时使用观察者模式
当一个对象的改变时,需要改变其他的对象,并且它不知道具体要改变多少对象。
四,模式中的角色
1,抽象主题(Subject):它把所有观察者对象的引用保存到一个集合里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
2,具体主题(ConcreteSubject):将有关状态存入具体观主题对象,当具体主题的状态改变时,给所有登记过的观察者发出通知。
3,抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
4,具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
五,应用实例
#include <iostream>#include <vector>#include <string>using namespace std;class Observer{public: virtual void Update(){}};class Subject{private: vector<Observer *> observers;public: //增加观察者 void Add(Observer *p){ observers.push_back(p); } //移除观察者 void Remove(Observer *p){ for(vector<Observer *>::iterator iter = observers.begin(); iter != observers.end(); iter ++){ if(p == *iter){ observers.erase(iter); break; } } } //通知 void Notify(){ for(vector<Observer *>::iterator iter = observers.begin(); iter != observers.end(); iter ++){ (*iter)->Update(); } }};class ConcreteSubject : public Subject{private: string state;public: string getState(){ return state; } void setSatate(const string &str){ state = str; }};class ConcreteObserver : public Observer{private: string name; string observerState; ConcreteSubject &subject;public: ConcreteObserver(ConcreteSubject &subject, const string &name):subject(subject), name(name){} void Update(){ observerState = subject.getState(); cout<<"观察者 : "<<name<<" 的状态是 : "<<observerState<<endl; }};int main(){ ConcreteSubject s; s.Add(new ConcreteObserver(s, "1")); s.Add(new ConcreteObserver(s, "2")); s.setSatate("sleep"); s.Notify(); s.setSatate("wake"); s.Notify(); return 0;}
输出结果
观察者 : 1 的状态是 : sleep观察者 : 2 的状态是 : sleep观察者 : 1 的状态是 : wake观察者 : 2 的状态是 : wakeProcess returned 0 (0x0) execution time : 0.009 sPress any key to continue.
阅读全文
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- #java 读取windows AD域sid乱码问题
- AndroidStudio中遇到的情况
- “ windows套接字初始化失败”解决方法
- 大话设计模式笔记(二)——商品促销 策略模式
- KMP算法及其应用
- 观察者模式
- poj1279Art Gallery
- 编译的classpath 未加入v4和v7库
- 移除数组中的重复元素
- 数据库导出数据到文本文件的两种方式
- CloudStack管理员文档
- golang协程 通道channel阻塞
- MyEclipse/Eclipse快捷键
- SpringMVC4.2.1+jasper+ireports5.6整合及部门问题解决方案