观察者模式
来源:互联网 发布:苏联大清洗知乎 编辑:程序博客网 时间:2024/06/17 16:35
观察者模式
- 观察者模式
- 概念
- 角色及职责
- 案例
概念
Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步。
角色及职责
- Subject(被观察者)
被观察的对象。当需要被观察的状态发生变化时,需要通知队列中所有观察者对象。Subject需要维持(添加,删除,通知)一个观察者对象的队列列表。
ConcreteSubject
被观察者的具体实现。包含一些基本的属性状态及其他操作。Observer(观察者)
接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。ConcreteObserver
观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。
适用于:
定义对象间一种一对多的依赖关系,使得每一个对象改变状态,则所有依赖于他们的对象都会得到通知。
案例
- 侦听事件驱动程序设计中的外部事件
- 侦听/监视某个对象的状态变化
- 发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者
使用场景:定义了一种一对多的关系,让多个观察对象(公司员工)同时监听一个主题对象(秘书),主题对象状态发生变化时,会通知所有的观察者,使它们能够更新自己。
#include <iostream>#include <string>#include <list>using namespace std;/*前置声明--以便各个类声明的时候使用对方*/class PlayObserver;class Secretary;/*观察者(本案例中没有用抽象观察者)*--包含被观察对象/主题对象做成员变量*--如果使用抽象观察者--具体观察者会对主题对象的消息产生不同动作的响应*/class PlayObserver{public: PlayObserver(Secretary *sec)//构造函数里有主题对象做参数 { m_sec = sec; } void Update(string action)//观察者接收到被观察者的状态变化消息以后的响应函数 { cout<<action<<endl; }private: Secretary *m_sec;//主题对象做成员变量};/*被观察者--需要维持(添加,删除,通知)一个观察者对象的队列列表。*/class Secretary{public: Secretary()//构造函数 { m_list.clear(); } /*状态发生变化的时候--会调用这个函数通知所有的观察者*/ void Notify(string info) { for(list<PlayObserver*>::iterator it = m_list.begin();it != m_list.end();it++) { (*it)->Update(info); } } /*设置观察者--添加到观察者队列*/ void setPlayObserver(PlayObserver* o) { m_list.push_back(o); }private: list<PlayObserver*> m_list;//观察者队列};int main(){ Secretary * tmp_sec = NULL;//被观察者 /*定义两个观察者对象*/ PlayObserver * po1 = NULL; PlayObserver * po2 = NULL; /*实例化被观察者*/ tmp_sec = new Secretary; /*实例化观察者*/ po1 = new PlayObserver(tmp_sec); po2 = new PlayObserver(tmp_sec); /*被观察者设置观察者对象*/ tmp_sec->setPlayObserver(po1); tmp_sec->setPlayObserver(po2); /*被观察者状态改变--通知所有观察者*/ tmp_sec->Notify("boss coming"); /*内存回收*/ delete tmp_sec; delete po1; delete po2; return 0;}
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 【leetcode】Remove Duplecates from Sorted Array 和 Remove Duplicates from Sorted List
- 左手有话说(2)
- 【Linux多线程同步】读写锁
- JQUERY EASYUI DATAGRID设置可编辑行的某个列不可编辑
- Linux-gdb调试
- 观察者模式
- CSS清除浮动的方法优缺点分析
- ORACLE PROFILE(配置文件)查询
- PhoneGAP实现带进度条的文件上传(支持任意类型文件)
- 网络层 学习笔记
- 微信直播平台制作
- RabbitMQ初探
- mfc Png转IStream
- 给recyclerView加头加尾