观察者模式概念:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,全部依赖于它的对象都得到通知并自己主动更新。“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. 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. angularjs -- 监听angularJs列表数据是否渲染完毕

    前端在做数据渲染的时候经常会遇到在数据渲染完毕后执行某些操作,这几天就一直遇到在列表和表格渲染完毕后,执行点击和选择操作.对于angularjs处理这类问题,最好的方式就是指令 directive. ...

  2. RollViewPager图片轮播效果开源框架的使用

    RollViewPager是一个自动轮播的Viewpager, 支持无限循环. 触摸时会暂停播放,直到结束触摸一个延迟周期以后继续播放. 看起来就像这样.指示器可以为点可以为数字还可以自定义,位置也可 ...

  3. redis 迭代命令SCAN、SSCAN、HSCAN、ZSCAN

    SCAN 命令用于迭代当前数据库中的数据库键.SSCAN 命令用于迭代集合键中的元素.HSCAN 命令用于迭代哈希键中的键值对.ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值). S ...

  4. save与Update的合并操作 标签: 关系映射 2017-07-13 15:11 7人阅读 评论(0) 收藏

    做save与update的方法合并操作时,判断条件是主体对象的ID是否存在. 但是当页面中,涉及到多个主体对象的关联对象时,情况变得复杂起来,特总结项目中的几点 一.页面中的VO对象属性可以分为三类: ...

  5. 关于C#线程,线程池和并行运算的简单使用和对比

    转自:https://www.cnblogs.com/jeffwongishandsome/archive/2010/11/12/1876137.html 先大概看一下控制台应用程序的Main方法的主 ...

  6. sqlserver 统计信息自动更新 ----trace flag 2371

    对于已经应用的表(非临时表)统计信息更新条件为500+20%,具体更新条件 If the statistics is defined on a regular table, it is out of ...

  7. web应用服务端cache策略初探

    一般来说,网站随着访问量以及数据库的增大,访问速度将会越来越慢,如何优化这个响应速度,增大用户支持容量是网站从小到中,到大的必经之路. 你也可能听说过对于大型web站点一般严重依赖于cache来弹性放 ...

  8. Oracle EBS 查看请求执行情况

    SELECT s.* FROM fnd_concurrent_requests r, v$session v, v$sql s WHERE r.oracle_session_id = v.audsid ...

  9. Ubuntu安装 和 python开发

    在ubuntu上安装pycharm 可以好几种下载办法 1.pycharm之linux版本下载地址: https://download.jetbrains.8686c.com/python/pycha ...

  10. REST Framework 的分页

    分页: PageNumberPagination from rest_framework.pagination import PageNumberPagination 导入分页之后你要实例化分页这个对 ...