c++ 观察者模式
观察者模式之比喻:
/**
* 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++ 观察者模式的更多相关文章
- 23种设计模式--观察者模式-Observer Pattern
一.观察者模式的介绍 观察者模式从字面的意思上理解,肯定有两个对象一个是观察者,另外一个是被观察者,观察者模式就是当被观察者发生改变得时候发送通知给观察者,当然这个观察者可以是多个对象,在项 ...
- 谈谈JS的观察者模式(自定义事件)
呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...
- ObserverPattern(观察者模式)
import java.util.ArrayList; import java.util.List; /** * 观察者模式 * @author TMAC-J * 牵一发而动全身来形容观察者模式在合适 ...
- java观察者模式
像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式.在软件系统中,当一个对象的行为依赖于另一个对象的状态 ...
- Backbone源码解析(六):观察者模式应用
卤煮在大概一年前写过backbone的源码分析,里面讲的是对一些backbone框架的方法的讲解.这几天重新看了几遍backbone的源码,才发现之前对于它的理解不够深入,只关注了它的一些部分的细节和 ...
- PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式
SPL(标准PHP库 - Standard PHP Library)是PHP5面向对象功能中重要的部分.原文解释是这样的“The Standard PHP Library (SPL) is a col ...
- 设计模式--观察者模式初探和java Observable模式
初步认识观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用报纸期刊的订阅来形象的说明: 报社方负责出版报纸. 你订阅了该报社的报纸,那么只要报社发布了新报 ...
- 学C#之设计模式系列笔记(2)观察者模式
一.借鉴说明 1.<Head First Design Patterns>(中文名<深入浅出设计模式>) 2.维基百科,观察者模式,https://zh.wikipedia.o ...
- PHP 观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. [观察者模式中主要角色] 1.抽象主题(Subject)角色: 抽象主题提供了增加 ...
- GJM: 设计模式 - 观察者模式
GJM : 观察者模式 视频地址: http://www.imooc.com/learn/415 本课程通过一个天气预报的发布和订阅案例,来讲解观察者模式在Java项目中的应用.主要包括观察者模式的结 ...
随机推荐
- fill 函数
fill函数的作用是:将一个区间的元素都赋予val值.函数参数:fill(first,last,val);//first为容器的首迭代器,last为容器的末迭代器,val为将要替换的值. 例题:给你n ...
- httpclient 302 重定向
主要是由于页面可能不是通过 request.sendRedirect跳转的,可能通过js location跳转的.所以需要拿跳转后的 地址,重新发送请求...如下所示 if (status == H ...
- MySQL提示:The server quit without updating PID file问题的解决办法
错误如下: [root@snsgou mysql]# service mysql restartMySQL server PID file could not be found![失败]Startin ...
- [mock]12月28日
假设我们有一个全局升序数组,这个数组长度unlimited现在我们有一个全局的指针和一个目标target值,target和指针你不可见.但是有以下几个操作bool istag();void gorig ...
- DVB系统中PCR的生成和PCR校正
http://blog.csdn.net/chenliangming/article/details/3616720 引自<广播电视信息>2008年1月 从数字电视前端系统功能上来讲,传统 ...
- D3DXCOLOR 和 D3DCOLOR 和 D3DCOLORVALUE
D3DCOLOR 是一个DWORD 型.第一个byte表示Alpha值,后面三个byte依次是r(红)g(绿)b(蓝)值.32位. 下面是一些关于D3DCOLOR 的宏: D3DCOLOR_ARGB( ...
- 187. Repeated DNA Sequences
题目: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: " ...
- P44、面试题4:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”.例如输入“We are happy.”,则输出“We%20are%20happy.”. 如果用java string类中提供的replace ...
- node.js模块之fs文件系统
fs 模块是文件操作的封装,它提供了文件的读取.写入.更名.删除.遍历目录.链接等 POSIX 文件系统操作.与其他模块不同的是,fs 模块中所有的操作都提供了异步的和同步的两个版本, 例如读取文件内 ...
- JVM内存管理(一)
方法区: 方法区存放了要加载的类的信息(名称.修饰符等).类的静态变量.类中定义为final类型的常量.类中的field信息.类中的方法信息.当开发人员在程序中通过Class对象的getName.is ...