#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++实现的更多相关文章

  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. beetl 模板语法

    如何定义临时变量 @var tmp = false; 如何给临时变量赋值 @tmp = true; 如何在判断中使用临时变量 @if(tmp){ ... @} 如何使用条件语句 if else @if ...

  2. Spring5参考指南:基于Schema的AOP

    文章目录 基于Schema的AOP 定义Aspect 定义Pointcut 定义Advice advice参数 Advisors 基于Schema的AOP 上篇文章我们讲到了使用注解的形式来使用Spr ...

  3. 编写管理IP地址参数脚本(永久性)

    1.用各种命令取出/etc/passwd文件前5行的最后一个字母.(2种) 2.编写管理IP地址参数脚本(永久性) a.只能用sed命令完成 b.提示用户变量赋值(IP.子网掩码.网关.DNS等) c ...

  4. Gym 101194D Ice Cream Tower

    被一道数位DP折磨得欲仙欲死之后,再做这道题真是如同吃了ice cream一样舒畅啊 #include<bits/stdc++.h> using namespace std; #defin ...

  5. 【JAVA基础】02 Java基础语法

    一.内容 注释 关键字 标识符 常量.进制和进制转换 变量 数据类型和类型转换 运算符 语句 二.注释 注释概述 用于解释说明程序的文字 Java中注释分类格式 单行注释 格式://注释文字 多行注释 ...

  6. Linux中的常用符号

    >, 1>     输出重定向符stdout,代码为1,重定向内容到文件,清除已有的内容,然后加入新内容,如果文件不存在还会创建文件 >>, 1>>   追加输出重 ...

  7. 更改 vsftpd 的端口号

    2019独角兽企业重金招聘Python工程师标准>>> vsftpd启动后,默认的ftp端口是21,现在我想把ftp端口改成 801 ,修改后能保证用户上传下载不受影响 1.编辑 / ...

  8. html入门详细笔记

    Web的基本概念 什么是Web? 中文翻译"网页",它是一些列技术的总称,(包括网站的前台布局.后台程序.美工.数据库开发等),我们称它为网页. Web标准 结构标准(HTML) ...

  9. HDU Problem D [ Humble number ]——基础DP丑数序列

    Problem D Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submi ...

  10. 洛谷P1217 回文质数

    题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000 ...