观察者模式之比喻:

有家公司,老板经常不按时上班,于是员工就可以在老板来之前的那段时间娱乐一下,但是又过的是心惊胆战,怕
老板随时出现;这是观察者模式就起作用了;公司有个前台,她总是第一个看到老板进门并且有时间通知大家的人,
于是员工都可以在前台那里登记一下,是否需要得到通知,其他事情也可以通过前台通知,比如说来了一个快递等;
实现代码如下:
 /**
* Define observer mode
*/
#include <iostream>
#include <list>
using namespace std; #ifndef NULL
#define NULL ((void*)0)
#endif // 各种消息的基类
class DOBject
{
public:
DOBject(int value){
value = value;
}
~DOBject();
private:
public:
/* data */
int value;
public:
/* Function */
bool operator ==(const DOBject &otherObject){
return (value==otherObject.value);
}
};
// 类员工类
class DListener
{
public:
DListener(/*arguments*/);
~DListener();
/* data */
/* Respond to notify */
public:
void OnNotify(DObject *object)
{
// Do something
return ;
}
};
// 类前台类
class DObserverObject
{
public:
DObserverObject(/*arguments*/){
m_pListeners = new List<DListener*>();
m_pObject = new DObject();
}
~DObserverObject(){
if (NULL != m_pObject)
{
/* code */
delete m_pObject;
}
if (NULL != m_pListeners)
{
/* 需要循环把list里面的注册者都清理掉 */
for(int i=, count=m_pListeners->size(); i < count; ++i){
delete m_pListeners->get(i);
m_pListeners->get(i) = NULL;
}
delete m_pListeners;
}
}
// 员工注册
void Registe(DListener *newListener){
m_pListeners->add(newListener);
}
// 取消注册
void UnRegiste(DListener *newListener){
m_pListeners->remove(newListener);
}
//通知员工
void SendNotify(void){
for (int i = ; i < m_pListeners.size(); ++i)
{
/* 需要循环将所有注册的员工都通知到 */
m_pListeners[i]->OnNotify(m_pObject);
}
}
// 一般对于这个有俩种传递数据的方式,推或者拉
// 对于推方式,则SendNotify需要加参数;
// 对于拉方式,则SendNotify不需要参数,由员工自己通过GetValue去取
DObject *GetValue(void){
return m_pObject;
}
//发生了什么事情,老板来了,或者快递来了
void SetValue(DObject *newObject){
if (m_pObject!=*newObject)
{
/* code */
m_pObject->value = newObject->value;
SendNotify(newObject);
}
}
/* data */
private:
List<DListener*> *m_pListeners;
DObject *m_pObject;
};

对于以上代码可能对于list的使用存在问题,还未完全测试,有兴趣的可以自己进行测试,也可以自己自己采用其他数据结构!

谢谢!

c++ 观察者模式的更多相关文章

  1. 23种设计模式--观察者模式-Observer Pattern

    一.观察者模式的介绍      观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...

  2. 谈谈JS的观察者模式(自定义事件)

    呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...

  3. ObserverPattern(观察者模式)

    import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...

  4. java观察者模式

      像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...

  5. Backbone源码解析(六):观察者模式应用

    卤煮在大概一年前写过backbone的源码分析,里面讲的是对一些backbone框架的方法的讲解.这几天重新看了几遍backbone的源码,才发现之前对于它的理解不够深入,只关注了它的一些部分的细节和 ...

  6. PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式

    SPL(标准PHP库 - Standard PHP Library)是PHP5面向对象功能中重要的部分.原文解释是这样的“The Standard PHP Library (SPL) is a col ...

  7. 设计模式--观察者模式初探和java Observable模式

    初步认识观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用报纸期刊的订阅来形象的说明: 报社方负责出版报纸. 你订阅了该报社的报纸,那么只要报社发布了新报 ...

  8. 学C#之设计模式系列笔记(2)观察者模式

    一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,观察者模式,https://zh.wikipedia.o ...

  9. PHP 观察者模式

    观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. [观察者模式中主要角色] 1.抽象主题(Subject)角色: 抽象主题提供了增加 ...

  10. GJM: 设计模式 - 观察者模式

    GJM : 观察者模式 视频地址: http://www.imooc.com/learn/415 本课程通过一个天气预报的发布和订阅案例,来讲解观察者模式在Java项目中的应用.主要包括观察者模式的结 ...

随机推荐

  1. NOIP2014 行记

    不知道OI是啥或者信息学竞赛是啥的可以按`Ctrl+W`. <del>很早开始写的..准备出分之后再发布.</del> 谨以此文纪念我信息学竞赛的第一次正式考试. 背景音乐底部 ...

  2. 解决WIN8 磁盘100 活动占用100% win8硬盘一直响

    一.先看最终效果: 二.再说解决办法:   1.任务管理器关闭进程 taskhost.exe和类似于taskhostxx.exe开头的进程. 2.在电源管理里面设置2分钟不使用硬盘则关闭硬盘,看我的截 ...

  3. SQL Server 2008 设计与实现笔记(一)

    Chart5 create database MovieRental; select name, SUSER_SNAME(sid) as [login] from sys.database_princ ...

  4. 让wordpress投稿作者在后台只看到自己的文章

    wordpress支持多作者撰写,让更多的人参与网站内容的创建是个不错的想法,UGC(User-generated content)使网站主题更丰富,不同的内容吸引不同的受众,一个好的网站应该多产生U ...

  5. 项目图片上传存储的目录部分代码思路Calendar类获取年月日

    在项目中将产品图片全部放置在一个文件夹下面的话,如果图片很多的话,加载速度会减慢,可以按照文件夹按年,月,日来分开存放,图片文件名字取系统时间long类型加上5位随机数字码避免重复. Calendar ...

  6. Angular.js入门的样例

    感觉这下子,前端的路也宽多了,从容不迫了. 因为可控制的节点又推前了, 有空了好好学一下. 然后结合EXPRESS或METEOR,是不是有点爽? 参考URL: https://toddmotto.co ...

  7. 到底该不该熟悉掌握struts2的ONGL呢?

    其实,在学习网站开发过程中,其实不掌握ONGL也是可以的.我们完全可以使用JSTL和EL来代替OGNL. 只要存在要往页面传输内容,我们直接把对象放在request范围即可,这样我们就可以在jsp中使 ...

  8. Android:自定义标题栏

    现在很多的Android程序都在标题栏上都显示了一些按钮和标题,这里尝试做个实例 在onCreate中添加: //自定义标题 requestWindowFeature(Window.FEATURE_C ...

  9. Linux信号列表

    我们运行如下命令,可看到Linux支持的信号列表: ~$ kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) ...

  10. Vim的tag系统

    tag标识符存储在ctags等程序生成的文件里 :tag和<C-]>命令跳转到光标所在符号(若光标不再符号上则为右边第一个符号)的定义处 还有g+鼠标左键和<C-鼠标左键> & ...