观察者模式之比喻:

有家公司,老板经常不按时上班,于是员工就可以在老板来之前的那段时间娱乐一下,但是又过的是心惊胆战,怕
老板随时出现;这是观察者模式就起作用了;公司有个前台,她总是第一个看到老板进门并且有时间通知大家的人,
于是员工都可以在前台那里登记一下,是否需要得到通知,其他事情也可以通过前台通知,比如说来了一个快递等;
实现代码如下:
 /**
* 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. 【win8技巧】去掉Win8导航菜单下面的这台电脑其他的文件夹

    win8 删除 上传 下载 这台电脑 左侧导航 另存为中的 视频.图片.文档.下载的方法!落雨 win8 Windows 8.1  默认将视频.图片.文档.下载.音乐.桌面等常用文件夹也显示在其中了, ...

  2. MySql 使用正则表达式

    MySql 用where 子句对正则表达式提供了支持,允许你指定正则表达式,注意mysql仅支持多数正则表达式实现的一个很小的子集. 1.基本字符匹配: SELECT prod_name FROM p ...

  3. 基于Oracle OCI的数据访问C语言接口ORADBI .

    基于Oracle OCI的数据访问C语言接口ORADBI cheungmine@gmail.com Mar. 22, 2008   ORADBI是我在Oracle OCI(Oracle 调用接口)基础 ...

  4. ECNU1104-BFS

    简单的BFS题意:多起点多终点 /* 简单的BFS 题意:多起点多终点 */ #include<stdio.h> #include<string.h> #include< ...

  5. linux Ubuntu12 设置root用户登录图形界面

    Ubuntu 12.04默认是不允许root登录的,在登录窗口只能看到普通用户和访客登录.以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后,修改系统配置文件需要切换到超级用户模式,在终端 ...

  6. ibatis的there is no statement named xxx in this SqlMap

    报错情况如下: com.ibatis.sqlmap.client.SqlMapException: There is no statement named Control.insert-control ...

  7. HeadFirst设计模式之模板方法模式

    一. 1.The Template Method defines the steps of an algorithm and allows subclasses to provide the impl ...

  8. C++中的INL

    inl文件介绍 inl文件是内联函数的源文件.内联函数通常在C++头文件中实现,但是当C++头文件中内联函数过多的情况下,我们想使头文件看起来简洁点,能不能像普通函数那样将内联函数声明和函数定义放在头 ...

  9. POJ3260——The Fewest Coins(多重背包+完全背包)

    The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...

  10. 高难度(1)什么是AR

    在介绍增强现实(AR)之前,需要先说说虚拟现实(VR) 虚拟现实是从英文Virtual Reality 一词翻译过来的,简称VR.VR 技术是采用以计算机技术为核心的技术,生成逼真的视.听.触觉等一体 ...