C++ 实现设计模式之观察者模式
1. 什么是观察者模式?
观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
2. 有什么用?
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。例如: 游戏里,当玩家触发 Attack ,界面的一系列变化:角色攻击动画播放,怪物倒地,伤害量计算与显示。这些变化都基于玩家 attack 动作。 而这些变化是可以无限扩展的。
3. 程序示例代码
本程序简单实现了公司里面的一个场景。一群偷懒的员工(observer)趁老板不在,偷偷做自己的私事。不用担心被老板捉到,他们早已通知门口的前台 May(subject),当老板回来后,立马通知他们。一下是本程序的全部代码, linux 下编译运行正常, 注意 本程序用到了 boost库的 shared_ptr 。需要安装Boost库才能正常运行。
//file name : BaseObserver.h #ifndef __BASE_OBSERVER_H__
#define __BASE_OBSERVER_H__ #include <string> #include "BaseSubject.h"
#include <boost/shared_ptr.hpp> using namespace std;
using namespace boost; typedef shared_ptr<BaseSubject> basesubject_t; class BaseObserver //观察者基类
{
protected :
std::string m_name;
basesubject_t m_sub; public :
BaseObserver();
BaseObserver(std::string name, basesubject_t sub);
virtual void Update()
{
}
}; #endif
//file name : BaseObserver.cpp #include "BaseObserver.h" BaseObserver::BaseObserver()
{ } BaseObserver::BaseObserver(std::string name, basesubject_t sub): m_name(name), m_sub(sub)
{ }
//file name BaseSubject.h #ifndef __BASE_SUBJECT_H__
#define __BASE_SUBJECT_H__ #include <list>
#include <string>
#include <boost/shared_ptr.hpp> using namespace std;
using namespace boost; class BaseObserver; typedef shared_ptr<BaseObserver> baseobserver_t; class BaseSubject
{ private :
std::list<baseobserver_t> m_observers; public :
void Attach(baseobserver_t ob); void Detach(BaseObserver* ob); void Notify(); public :
string m_subject_state;
}; #endif
//file name BaseSubject.cpp #include "BaseSubject.h"
#include "BaseObserver.h"
#include <iostream> void BaseSubject::Attach(baseobserver_t ob)
{
m_observers.push_back(ob);
} void BaseSubject::Detach(BaseObserver* ob)
{ } void BaseSubject::Notify()
{
for(std::list<baseobserver_t>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
{
(*it)->Update();
}
}
//file name: bossSecretaryWorkers.cpp #include <ostream>
#include <list>
#include <string> #include "boost/shared_ptr.hpp" #include "BaseObserver.h"
#include "BaseSubject.h" using namespace std;
using namespace boost; class Secretary : public BaseSubject
{ }; class Boss : public BaseSubject
{ }; class StockObserver : public BaseObserver
{
public :
StockObserver(string name, basesubject_t sub) : BaseObserver(name, sub)
{ } void CloseStock()
{
cout<<m_sub->m_subject_state<<m_name<<" 关闭CloseStock"<<endl;
} void Update()
{
CloseStock();
}
}; class NBAObserver : public BaseObserver
{
public :
NBAObserver(string name, basesubject_t sub): BaseObserver(name, sub)
{
} void Update()
{
CloseNBA();
} void CloseNBA()
{
cout<<m_sub->m_subject_state<<m_name<<" 关闭NBA"<<endl;
}
}; typedef shared_ptr<Boss> boss_t;
typedef shared_ptr<Secretary> secretary_t;
typedef shared_ptr<StockObserver> stockobserver_t;
typedef shared_ptr<NBAObserver> nbaobserver_t; int main(int argc, char** argv)
{
boss_t boss(new Boss());
secretary_t may(new Secretary());
stockobserver_t neo(new StockObserver("neo", may));
nbaobserver_t jason(new NBAObserver("jason", may)); may->m_subject_state = "老板回来啦! ";
may->Attach(neo);
may->Attach(jason); (*may).Notify(); /*
boss->m_subject_state = "老板回来啦! ";
boss->Attach(neo);
boss->Attach(jason);
*/
(*boss).Notify(); return ;
}
C++ 实现设计模式之观察者模式的更多相关文章
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式之观察者模式(Observable与Observer)
设计模式之观察者模式(Observable与Observer) 好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情 ...
- 8.5 GOF设计模式四: 观察者模式Observer
GOF设计模式四: 观察者模式Observer 现实中遇到的问题 当有许多不同的客户都对同一数据源感兴趣,对相同的数据有不同的处理方式,该如 何解决?5.1 定义: 观察者模式 观察者模式 ...
- php 设计模式之观察者模式(订阅者模式)
php 设计模式之观察者模式 实例 没用设计模式的代码,这样的代码要是把最上面那部分也要符合要求加进来,就要修改代码,不符合宁增不改的原则 介绍 观察者模式定义对象的一对多依赖,这样一来,当一个对象改 ...
- [JS设计模式]:观察者模式(即发布-订阅者模式)(4)
简介 观察者模式又叫发布---订阅模式,它定义了对象间的一种一对多的关系,让多个观察者对象同时监听某一个主题对象,当一个对象发生改变时,所有依赖于它的对象都将得到通知. 举一个现实生活中的例子,例如小 ...
- 实践GoF的23种设计模式:观察者模式
摘要:当你需要监听某个状态的变更,且在状态变更时通知到监听者,用观察者模式吧. 本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:观察者模式>,作者: 元闰子 . 简介 现在有 ...
- java设计模式之观察者模式
观察者模式 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式.模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.在此种模 ...
- [python实现设计模式]-4.观察者模式-吃食啦!
观察者模式是一个非常重要的设计模式. 我们先从一个故事引入. 工作日的每天5点左右,大燕同学都会给大家订饭. 然后7点左右,饭来了. 于是燕哥大吼一声,“饭来啦!”,5点钟定过饭的同学就会纷纷涌入餐厅 ...
- 【GOF23设计模式】观察者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_观察者模式.广播机制.消息订阅.网络游戏对战原理 package com.test.observer; import ja ...
- 设计模式学习——观察者模式(Observer Pattern)
0. 前言 观察者模式在许多地方都能够用到,特别是作为MVC模式的一部分,在MVC中,模型(M):存放数据,视图(V):显示数据.当模型中的数据发生改变时,视图会得到通知,这是典型的观察者模式. 1. ...
随机推荐
- VIM 分割窗口
VIM 分割窗口 *08.1* 分割窗口 打开新窗口最简单的命令如下: :split 这个命令把屏幕分解成两个窗口并把光标置于上面的窗口中: +----------------------- ...
- A+B Problem III
描述 求A+B是否与C相等. 输入 T组测试数据. 每组数据中有三个实数A,B,C(-10000.0<=A,B<=10000.0,-20000.0<=C<=20000.0) 数 ...
- (转)CentOS 6.5下Redis安装详细步骤
Redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作 ...
- 到目前为止,Linux下最完整的Samba服务器配置攻略
关 于Samba,大家有没有这种感觉,弄了N久丫的死活不喘气儿.找来各种“哥”和“姐”,发现全是“详解…配置专题”,看了半天不知道别个在说什么,好不 容易找了个简单的教程,从头到尾跟着做,尼玛,浪费时 ...
- pat 1006 Sign In and Sign Out (25)
At the beginning of every day, the first person who signs in the computer room will unlock the door, ...
- akka构建简单分布式应用
http://www.cnblogs.com/hequn/articles/3764630.html 当程序的要求达到一台计算机的极限时,我们便需要将程序分布式化,让程序运行在多台计算机上.akka提 ...
- 【MINA】序列化和反序列化我们要考虑的问题
概念 序列化:将java对象转换为字节序列的过程叫做序列化 反序列化:将字节对象转换为java对象的过程叫做反序列化 要解决的问题 1.序列化时间 2.反序列化时间 3.bytes大小 4.操作方便 ...
- 树莓派配置AP模式
所需硬件:树莓派.无线网卡 1.查看无线网卡是否被识别 pi@raspberrypi ~ $ sudo lsusb Bus Device : ID : Standard Microsystems Co ...
- Latex之CJK中文书签乱码[转]
在使用CJK宏包编辑中文时,可以使用不同的编码方式,一种是UTF-8格式:另外一种是GBK编码.在使用GBK编码时,生成的PDF格式中的文本是GBK的编码方式,因此大部分不支持GBK编码的PDF阅读器 ...
- Sencha Touch id 和 itemId
通过id获得组件: var view=Ext.getCmp('id'); 通过itemId获得组件: var view = ComponentQuery.query('view_xtype'), // ...