观察者模式C++实现

#include <iostream>
#include <vector>
#include <string>
using namespace std;
typedef string State;
class Observer;
// 目标
class Subject {
public:
Subject() {}
virtual ~Subject() {}
virtual void Attach(Observer *pObserver);
virtual void Detach(Observer *pObserver);
virtual void Notify();
virtual State GetState()=0;
virtual void SetState(const State& nState)=0;
private:
vector<Observer*> m_observers;
};
// 具体目标
class ConcreteSubject : public Subject {
public:
ConcreteSubject() {}
virtual ~ConcreteSubject() {}
virtual State GetState();
virtual void SetState(const State& nState);
private:
State m_State;
};
// 观察者
class Observer {
public:
Observer() {}
virtual ~Observer(){}
virtual void Update(Subject* pSubject)=0;
};
// 具体观察者
class ConcreteObserver : public Observer {
public:
ConcreteObserver(string nSubjectName, Subject * pSubject);
virtual ~ConcreteObserver();
virtual void Update(Subject* pSubject);
private:
string m_SubjectName;
State m_State;
Subject *m_pSubject;
};
// Subject
void Subject::Attach(Observer *pObserver) {
m_observers.push_back(pObserver);
}
void Subject::Detach(Observer *pObserver) {
for (vector<Observer*>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
if (*iter == pObserver) {
m_observers.erase(iter);
return;
}
}
}
void Subject::Notify() {
for (vector<Observer*>::iterator iter = m_observers.begin(); iter != m_observers.end(); ++iter) {
(*iter)->Update(this);
}
}
// ConcreteSubject
State ConcreteSubject::GetState() {
return m_State;
}
void ConcreteSubject::SetState(const State& nState) {
m_State = nState;
}
// ConcreteObserver
ConcreteObserver::ConcreteObserver(string nSubjectName, Subject * pSubject) {
m_SubjectName = nSubjectName;
m_pSubject = pSubject;
m_pSubject->Attach(this);
}
ConcreteObserver::~ConcreteObserver() {
m_pSubject->Detach(this);
if (m_pSubject != 0) delete m_pSubject;
}
void ConcreteObserver::Update(Subject* pSubject) {
m_State = pSubject->GetState();
cout << "observer name: " << m_SubjectName << " " << "state: " << m_State << endl;
}
int main() {
ConcreteSubject * pConcreteSubject = new ConcreteSubject();
Observer * o1 = new ConcreteObserver("observer1",pConcreteSubject);
Observer * o2 = new ConcreteObserver("observer2",pConcreteSubject);
pConcreteSubject->SetState("State_1");
pConcreteSubject->Notify();
pConcreteSubject->SetState("State_2");
pConcreteSubject->Notify();
return 0;
}
观察者模式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项目中的应用.主要包括观察者模式的结 ...
随机推荐
- Python数据分析:大众点评数据进行选址
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:砂糖侠 如果你处于想学Python或者正在学习Python,Pyth ...
- redis的5种数据类型
卸载服务:redis-server --service-uninstall 开启服务:redis-server --service-start 停止服务:redis-server --service- ...
- NTSTATUS code 和 Windows 系统错误码 的对应关系
出处:https://github.com/dokan-dev/dokany/blob/master/dokan/ntstatus.i case EPT_S_CANT_CREATE: return E ...
- 一篇文章让你彻底弄懂SSL/TLS协议
目录 SSL/TLS的应用 TLS协议的架构 握手协议 主密码和预备主密码 TLS记录协议 一篇文章让你彻底弄懂SSL/TLS协议 SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法 ...
- Kubernetes-在Kubernetes集群上搭建HBase集群
经过3天的努力,终于在Kubernetes上把HBase集群搭建起来了,搭建步骤如下. 创建HBase镜像 配置文件包含core-site.xml.hbase-site.xml.hdfs-site ...
- nginx平滑升级、在线添加模块(tengine 动态加载模块)
http://www.orzace.com/how-to-upgrade-nginx/ 下面是nginx替换成tengine再加上lua 模块,(tengine-2.0.1版本暂时无法动态加载lua模 ...
- Mysql 开窗函数实战
Mysql 开窗函数实战 Mysql 开窗函数在Mysql8.0+ 中可以得以使用,实在且好用. row number() over rank() over dense rank() ntile() ...
- #Week5 Regularization
一.The Problem of Overfitting 欠拟合(high bias):模型不能很好地适应训练集: 过拟合(high variance):模型过于强调拟合原始数据,测试时效果会比较差. ...
- HDU-1857 畅通工程再续
畅通工程再续 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定 ...
- 跟哥一起学Python(1) - python简介
01—写在前面 我做了十几年的程序猿,码过代码.带过项目.做过产品经理.做过软件架构师.因为我是做通信设备软件的,面向底层操作系统,所以我的工作主要以C语言为主.Python在我的工作中通常用来写一些 ...