/*************************************************************************
观察者模式:
    思想:自己在玩游戏,怕老板发现,自己有很担心,委托秘书来完成观察的任务,当观察到某一刻的变化时,
        执行指定的任务,完成状态的切换
1.创建客户和观察者
2.客户将自己注册到观察者那里,当观察者得到某一消息时,挨个通知每个客户
3.观察者者通知携带有消息,调用客户的接收消息的函数,从而完成了所有客户的委托

这里分为两种模型:  1 直接将内容发送给各个观察者 --- 推送     2  将主题直接发送给观察者 ---拉模型
4.观察者使用一个容器来管理每个客户,从而挨个通知
***************************************************************************/

#include <iostream>
#include <list>
using namespace std;
class Subject;
class Observer
{
public:Observer(){}virtual ~Observer(){}virtual void update(Subject *subject) = 0;virtual void update(string content) = 0;
};class  Subject
{
public:Subject() {}virtual ~ Subject() {}virtual string getContent() = 0;virtual string getAbstractContent() = 0;virtual void setContent(string content) = 0;// 订阅主题void attach(Observer *observer) {observers.push_back(observer);}// 取消订阅void detach(Observer *observer) {observers.remove(observer);}// 通知所有的订阅者virtual void notifyObservers() {for(Observer *reader: observers) {// 拉模型  (也是有推送的性质,只是粒度小一些)reader->update(this);}}// 通知所有的订阅者virtual void notifyObservers(string content) {for(Observer *reader: observers) {// 推模型reader->update(content);}}
private:list<Observer *> observers;    // 保存注册的观察者
};class Reader : public Observer
{
public:Reader() {}virtual ~Reader() {}virtual void update(Subject *subject) {// 调用对应的方法去拉取内容 subject->getContent()cout << m_name << "收到报纸和阅读它, 具体内容" << subject->getContent() << endl;}virtual void update(string content) {// 推模型cout << m_name << "收到报纸和阅读它, 具体内容" << content << endl;}string getName() {return m_name;}void setName(string name) {m_name = name;}
private:string m_name;
};class NewsPaper: public Subject
{
public:NewsPaper() {}virtual ~NewsPaper() {}void setContent(string content) {m_content = content;notifyObservers();}virtual string getContent() {return m_content;}virtual string getAbstractContent() {return  "摘要:";}
private:string m_content;
};int main()
{// 创建一个报纸主题NewsPaper *subject = new NewsPaper();// 创建观察者,读者Reader *reader1 = new Reader();reader1->setName("reader1");Reader *reader2 = new Reader();reader2->setName("reader2");Reader *reader3 = new Reader();reader3->setName("reader3");subject->attach(reader1);subject->setContent("notifyObservers - 1");cout << "-----------------------" << endl;subject->attach(reader2);subject->attach(reader3);subject->setContent("notifyObservers -1 -2 -3 ");return 0;
}

示例2: 推送模型

#include <iostream>
#include <vector>
#include <string>
using namespace std;
class Secretary;
class PlayserObserver//玩游戏的同事类(观察者)
{
public:PlayserObserver(string name)//通过构造函数完成观察者的初始化{m_name = name;}void update(string action){cout << m_name << ": 收到:" << action << endl;}
private:string m_name;
};
class Secretary//秘书类(主题对象,通知者)
{
public:void addObserver(PlayserObserver *o){v.push_back(o);}void Notify(string action){for (vector<PlayserObserver *>::iterator it = v.begin(); it != v.end(); it++){(*it)->update(action);//这里是一个推的模型}}//此处容器拥有观察者对象的指针,然后带着参数去遍历不同观察者的统一接口的接受函数,显示接受到此消息
private:vector<PlayserObserver *> v;
};
void main()
{Secretary *s1 = new Secretary; //subject 被观察者PlayserObserver *po1 = new PlayserObserver("小张");//具体的观察者 被通知对象PlayserObserver *po2 = new PlayserObserver("小李");s1->addObserver(po1);//将其放进通知队列s1->addObserver(po2);s1->Notify("老板来了");//此处的通知函数是带有参数的system("pause");
}

设计模式---观察者模式(C++)相关推荐

  1. Python设计模式-观察者模式

    Python设计模式-观察者模式 代码基于3.5.2,代码如下; #coding:utf-8 # 观察者设计模式class observerInterface():def update(self,va ...

  2. [Head First设计模式]山西面馆中的设计模式——观察者模式

    原文:[Head First设计模式]山西面馆中的设计模式--观察者模式 系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也 ...

  3. java设计模式--观察者模式(Observer)

    java设计模式--观察者模式(Observer) java设计模式--观察者模式(Observer) 观察者模式的定义: 定义对象间的一种一对多的依赖关系.当一个对象的状态发生改变时,所有依赖于它的 ...

  4. 【学习笔记】ABAP OOD设计模式 - 观察者模式

    ABAP OOD设计模式 - 观察者模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的 ...

  5. Java设计模式-观察者模式(订阅发布模式)

    Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...

  6. 设计模式---观察者模式介绍与理解

    设计模式---观察者模式介绍与理解: 观察者模式原理:类似于定牛奶业务 1. 奶站,subject:登记注册,移除,通知(register,remove,notify) 2. 用户,observer: ...

  7. 设计模式-观察者模式 发布/订阅模式

    设计模式-观察者模式 发布/订阅模式 代码 观察者接口 public interface IHanFeiZi{// 当吃早饭时public void havBreakFast();// 进行娱乐活动时 ...

  8. 设计模式 | 观察者模式及典型应用

    本文主要内容: 介绍观察者模式 微信公众号的发布/订阅示例 观察者模式总结 分析观察者模式的典型应用 JDK 提供的观察者接口中的观察者模式 Guava EventBus 中的观察者模式 JDK 委托 ...

  9. 李建忠设计模式——观察者模式

    1.观察者模式(Observer/Event) 1.动机 在软件构建过程中,需要为某些对象建立一种"通知依赖关系"--一个对象(目标)的状态发生改变,所有的依赖对象(观察者对象)都 ...

  10. 设计模式●观察者模式

    设计模式●观察者模式 观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新.观察者模式又叫做发布-订阅( ...

最新文章

  1. Spring Boot配置文件学习记录【1】
  2. Java 源代码和 C 源代码的运行区别
  3. java下拉列表选日期_iPhone应用程序:日期选择器查看下拉列表
  4. eplan单线原理图多线原理图_【原创分享】西门子PLC电路图高效设计——基于EPLAN与TIA Selection...
  5. from表单提交和JSON区别
  6. 产品结构bom设计 mongodb_超全!注塑产品结构设计准则
  7. java semaphore(0)_面试官:说说Java中的信号量?Semaphore
  8. ubuntu 18.04 ROS melodic 尝试 ROS CANOPEN 控制 AGV
  9. 微软开始测试自己的Google Base
  10. 在SQL中用正则表达式替换html标签
  11. 在JS中使用Ajax
  12. C# winform打开Excel文档的方法总结!
  13. VS2010 用户自定义工具箱控件的制作方法
  14. Flutter之以阿里云图标库为例,使用多色图标
  15. Rasa3 domain官方文档翻译
  16. 飞php影视系统,i.php · 姬晓亮/海洋cms 海洋影视管理系统 - 免费开源PHP - Gitee.com...
  17. Skin Cancer MNIST(皮肤癌患者相关数据集)
  18. Word学习笔记分享
  19. 谈谈在项目过程中的发生争论与争吵
  20. 在linux服务器下配置代理服务器( 使用liunx服务器的ip用来代理 )

热门文章

  1. JavaWeb — 获取复选框的值时,要注意不是得到显示的值,而是得到value值
  2. 单机实验mysql的主从备份(master slaver)
  3. 2018-12-13丛晓强作业
  4. python - 日期处理模块
  5. gridview RowCommand 事件获取行索引
  6. zabbix详解(二)——zabbix工作原理
  7. [C语言循环应用]--打印字符金字塔
  8. Docker两种方式进入后台运行的容器
  9. HTMLjavaSkcriptCSSjQueryajax(六)
  10. [AlwaysOn Availability Groups]排查:AG配置