观察者模式
来源:互联网 发布:淘宝网店售后客服总结 编辑:程序博客网 时间:2024/06/08 02:36
观察者
观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
监视,观察者,都有一个基类,派生,实现不同的效果,监视者的类,管理所有的观察者,增加或者删除,发出消息,让观察者处理,观察者的类需要接受消息并处理
class Subject; //可以使用subjectclass Observer{protected: string name; Subject *sub;public: Observer(string name, Subject *sub)//观察者的名字, 监视与通知的类 { this->name = name;//输入名字 this->sub = sub;//设置谁来通知我 } virtual void update() = 0;//纯虚函数};class StockObserver :public Observer //继承,自己实现刷新函数{public: StockObserver(string name, Subject *sub) :Observer(name, sub) { } void update();};class NBAObserver :public Observer{public: NBAObserver(string name, Subject *sub) :Observer(name, sub) { } void update();};class Subject //{protected: list<Observer*> observers;///存储观察者的指针,链表public: string action; virtual void attach(Observer*) = 0; virtual void detach(Observer*) = 0; virtual void notify() = 0;//实现监听的基类};class Secretary :public Subject { void attach(Observer *observer) //载入通知的列表 { observers.push_back(observer); } void detach(Observer *observer)//删除 { list<Observer *>::iterator iter = observers.begin(); while (iter != observers.end()) { if ((*iter) == observer) { observers.erase(iter); } ++iter; } } void notify() ///通知函数 { list<Observer *>::iterator iter = observers.begin(); while (iter != observers.end()) { (*iter)->update(); ++iter; } }};void StockObserver::update(){ cout << name << " 收到消息:" << sub->action << endl; if (sub->action == "梁所长来了!") { cout << "我马上关闭股票,装做很认真工作的样子!" << endl; } if (sub->action == "去喝酒!") { cout << "我马上走" << endl; }}void NBAObserver::update(){ cout << name << " 收到消息:" << sub->action << endl; if (sub->action == "梁所长来了!") { cout << "我马上关闭NBA,装做很认真工作的样子!" << endl; } if (sub->action == "去喝酒!") { cout << "我马上拍" << endl; }}int main123123(){ Subject *dwq = new Secretary();//消息监视,监视 Observer *xs = new NBAObserver("xiaoshuai", dwq);//订阅消息 Observer *zy = new NBAObserver("zouyue", dwq); Observer *lm = new StockObserver("limin", dwq); dwq->attach(xs); dwq->attach(zy); dwq->attach(lm);//增加到队列 dwq->action = "去吃饭了!"; dwq->notify(); dwq->action = "去喝酒!"; dwq->notify(); cout << endl; dwq->action = "梁所长来了!"; dwq->notify(); cin.get(); return 0;}
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 如何查看授权的所有用户
- SQL 第五章 我的租房网
- 几分钟搞定 OpenStack Heat AutoScaling 根据CPU 自动伸缩VM
- 算法效率的度量与渐进分析
- jvm系列(七):jvm调优-工具篇
- 观察者模式
- 关于SVN导致桌面文件夹显示问号的解决方案
- 事件机制-Spring 源码系列(4)
- wamp安装说明
- Mysql 2003错误
- 跨域
- 优化Mychool 第六章上机
- 怎样用通俗的语言解释什么叫 REST,以及什么是 RESTful?
- 系统启动——Windows