观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并自己主动更新。“Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.” – GoF

UML图

特点:

1.观察者模式定义了对象之间一对多的关系。

2.主题(也就是可观察者)用一个共同的接口来更新观察者。

3.观察者和可观察者用松耦合的方式结合,可观察者不知道观察者的细节,仅仅知道观察者实现了观察者接口

4.有多个观察者时,不能够依赖特点的通知次序。

C++源码:

Observer.h

/*观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自己主动更新。
*/#include <iostream>
#include <vector>
using namespace std;class Observer;//Account抽象类,用作接口
class Account
{
protected:vector<Observer*> observer;double balance;
public:virtual void add_observer(Observer *o)=0;virtual void remove_observer(Observer *o)=0;virtual void notify_observer()=0;virtual void set_balance(double balance)=0;virtual double get_balance()=0;
public:virtual ~Account(){cout<<"in the destructor of Account"<<endl;}
};//Observer抽象类,用作接口
class Observer
{
protected:Account *account;
public:Observer(Account *account):account(account) {}virtual void handle_event()=0;virtual void set_account_balance(double balance)=0;virtual ~Observer(){cout<<"in the destructor of Observer"<<endl;}
};//BankAccount详细类,继承了ACcount抽象类
class BankAccount:public Account
{
public:~BankAccount(){cout<<"in the destructor of BankAccount"<<endl;}public:void add_observer(Observer *o){observer.push_back(o);}void remove_observer(Observer *o){for(vector<Observer*>::iterator it=observer.begin(); it!=observer.end(); it++){if(o==*it){observer.erase(it);return;}}}void notify_observer(){for(vector<Observer*>::const_iterator it=observer.begin(); it!=observer.end(); it++){(*it)->handle_event();}}void set_balance(double balance){this->balance=balance;notify_observer();}double get_balance(){return balance;}};class ATM:public Observer
{
public:ATM(Account *account):Observer(account)//将acount传递给基类Observer的构造函数{}~ATM(){cout<<"in the destructor of ATM"<<endl;}
public:void handle_event(){cout<<"ATM: the balance of bank accont is changed to "<<account->get_balance()<<endl;}void set_account_balance(double balance){account->set_balance(balance);}
};class InternetBankService:public Observer
{
public:InternetBankService(Account *account):Observer(account) {}~InternetBankService(){cout<<"in the destructor InternetBankService "<<endl;}
public:void handle_event(){cout<<"IBS: the balance of bank account is changed to:"<<account->get_balance()<<endl;}void set_account_balance(double balance){account->set_balance(balance);}};

Observer.cpp

#include "Observer.h"
int main(int argc, char **argv)
{Account *account=new BankAccount();Observer *atm_observer=new ATM(account);Observer *ibs_observer=new InternetBankService(account);account->add_observer(atm_observer);account->add_observer(ibs_observer);account->set_balance(1000.12);cout<<"Event is triggered by atm_observer"<<endl;cout<<"============="<<endl;atm_observer->set_account_balance(1000.23);cout<<"Event is triggered by ibs_observer"<<endl;cout<<"============="<<endl;ibs_observer->set_account_balance(1000.36);delete atm_observer;delete ibs_observer;return 0;
}

例2:

Test_Observer.cpp

/*千万要注意对象切割问题的出现。一定要理解。
*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;class Observer
{
protected:string name;
public:virtual void update(){cout<<"Observer"<<endl;}
};class Man:public Observer
{
public:Man(string name){this->name=name;}void update(){cout<<name<<" Man is coming"<<endl;}
};
class Woman:public Observer
{
public:Woman(string name){this->name=name;}void update(){cout<<name<<" Woman is leaving"<<endl;}
};class Subject
{
private:vector<Observer*> obser;
public:void add(Observer &ob){obser.push_back(&ob);}void notify(){for (vector<Observer*>::iterator it=obser.begin(); it!=obser.end(); it++){(*it)->update();}}
};int main()
{Subject secret;Man m1("m1--");Man m2("m2--");Woman w1("w1");Woman w2("w2");secret.add(m1);secret.add(m2);secret.add(w1);secret.add(w2);secret.notify();return 0;}

观察者模式及c++实现相关推荐

  1. Java设计模式:观察者模式

    观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新. 如果这句话不好理解 可 ...

  2. 观察者模式的经典应用(猫叫 烧开水)

    Code 猫叫了 老鼠跑 主人惊醒  1/**//*  2 * 题目:  3 * 猫叫了,所有老鼠开始逃跑,主人被惊醒,请用OO的思想描绘此过程  4 * 1,老鼠跟主人是被动的  5 * 2,要考虑 ...

  3. Observer Pattern 观察者模式

    Observer Pattern (观察者模式) 定义: <设计模式>中对Observer模式的意图是这样描述的:"定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, ...

  4. 设计模式之观察者模式(Observer)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. java观察者模式_Java设计模式之观察者模式详解

    观察者模式,是一对多的关系,一个主题对应多个观察者,当这个主题发生变化的时候,所有观察着这个主题的观察者都会接收到通知来获悉主题的变化. 在现实中我们也会遇到许许多多应用观察者模式的行为,比如电视的节 ...

  6. python 设计模式 观察者_python设计模式之观察者模式

    说到观察者模式,在我脑海中总是闪现,这家伙跟消息队列的主题发布订阅有什么关系,虽然本人对消息队列没有很深的研究,但是凭直觉我就认为消息队列的实现就使用了观察者模式吧,所以本文就来模拟消息队列的丐版实现 ...

  7. JS设计模式-观察者模式

    观察者(又称发布订阅)模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新. 原文链接 应用场景 当用户在网页执行一些操作(如点击)后就需要执行 ...

  8. 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现

    1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject {publi ...

  9. 步步为营-44-窗体之间传值--观察者模式

    说明 :观察者模式又叫发布-订阅模式,其中又涉及到中介者模式 1 结构 2 创建Main窗体(中介者),ChildForm1(发布者),ChildForm2(订阅者),ChildForm3(订阅者), ...

  10. 观察者模式的Java实现及应用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Turwe www.jianshu.com/p/1025f6 ...

最新文章

  1. 权威预测:2018年这十大数字化转型趋势要火!
  2. python中True 为1 ,False为0
  3. 多个切点 boot spring_全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?...
  4. 打卡学习 | Redis原理应用-线程IO模型
  5. 常用模块——pickle模块
  6. 关于阿里云OSS报错-java.lang.ClassNotFoundException: org.jdom.input.JDOMParseException
  7. windows 虚拟磁盘的软链接_如何在Windows的操作系统下创建VHD虚拟磁盘
  8. bark 自建服务器,开发者的专属推送小工具 - Bark
  9. 台大李宏毅Machine Learning 2017Fall学习笔记 (13)Semi-supervised Learning
  10. BZOJ.2428.[HAOI2006]均分数据(随机化贪心/模拟退火)
  11. DbEntry.Net---又一个国产开源ORM数据访问及 WEB 框架
  12. 产品配件类目税目分类_商品和服务税收分类编码
  13. 原生JS实现拖动滑块验证登录效果
  14. vue播放flv格式视频
  15. 平时常见的视频文件格式有哪些呢?
  16. 微信小程序UI设计(一)之开发前言
  17. 芯片的组成材料是什么?详述芯片分类
  18. 解决创建文本文件,修改后缀为.py,仍改不了文本类型的问题
  19. java 中rest,Java中的REST调用
  20. 大疆2022 “拓疆者” 校园招聘

热门文章

  1. JVM—加载到方法区的Class文件长什么样?
  2. 搭建一个VUE+Express前后端分离的开发环境
  3. tp3.2 复合查询
  4. TZOJ 1321 Girls and Boys(匈牙利最大独立集)
  5. 练习7.28、7.29、7.30
  6. BZOJ2038: [2009国家集训队]小Z的袜子(hose)
  7. [CF791D]Bear and Tree Jumps
  8. ES6重点--笔记(转)
  9. 44 个 JavaScript 变态题解析
  10. 【.Net基础02】XML序列化问题