C++ 实现设计模式之观察者模式

1. 什么是观察者模式?

  观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

2. 有什么用?

  观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。例如: 游戏里,当玩家触发 Attack ,界面的一系列变化:角色攻击动画播放,怪物倒地,伤害量计算与显示。这些变化都基于玩家 attack 动作。 而这些变化是可以无限扩展的。

3. 程序示例代码

  本程序简单实现了公司里面的一个场景。一群偷懒的员工(observer)趁老板不在,偷偷做自己的私事。不用担心被老板捉到,他们早已通知门口的前台 May(subject),当老板回来后,立马通知他们。一下是本程序的全部代码, linux 下编译运行正常, 注意 本程序用到了 boost库的 shared_ptr 。需要安装Boost库才能正常运行。

 1 //file name : BaseObserver.h
 2
 3 #ifndef __BASE_OBSERVER_H__
 4 #define __BASE_OBSERVER_H__
 5
 6 #include <string>
 7
 8 #include "BaseSubject.h"
 9 #include <boost/shared_ptr.hpp>
10
11 using namespace std;
12 using namespace boost;
13
14 typedef shared_ptr<BaseSubject> basesubject_t;
15
16 class BaseObserver    //观察者基类
17 {
18     protected :
19         std::string m_name;
20         basesubject_t m_sub;
21
22     public :
23         BaseObserver();
24         BaseObserver(std::string name, basesubject_t sub);
25         virtual void Update()
26         {
27         }
28 };
29
30 #endif
 1 //file name : BaseObserver.cpp
 2
 3 #include "BaseObserver.h"
 4
 5 BaseObserver::BaseObserver()
 6 {
 7
 8 }
 9
10 BaseObserver::BaseObserver(std::string name, basesubject_t sub):  m_name(name), m_sub(sub)
11 {
12
13 }
 1 //file name BaseSubject.h
 2
 3 #ifndef __BASE_SUBJECT_H__
 4 #define __BASE_SUBJECT_H__
 5
 6 #include <list>
 7 #include <string>
 8 #include <boost/shared_ptr.hpp>
 9
10 using namespace std;
11 using namespace boost;
12
13 class BaseObserver;
14
15 typedef shared_ptr<BaseObserver> baseobserver_t;
16
17 class BaseSubject
18 {
19
20     private :
21         std::list<baseobserver_t> m_observers;
22
23     public :
24         void Attach(baseobserver_t ob);
25
26         void Detach(BaseObserver* ob);
27
28         void Notify();
29
30     public :
31         string m_subject_state;
32 };
33
34 #endif
 1 //file name BaseSubject.cpp
 2
 3
 4 #include "BaseSubject.h"
 5 #include "BaseObserver.h"
 6 #include <iostream>
 7
 8
 9 void BaseSubject::Attach(baseobserver_t ob)
10 {
11     m_observers.push_back(ob);
12 }
13
14
15 void BaseSubject::Detach(BaseObserver* ob)
16 {
17
18 }
19
20 void BaseSubject::Notify()
21 {
22     for(std::list<baseobserver_t>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
23     {
24        (*it)->Update();
25     }
26 }
 1 //file name: bossSecretaryWorkers.cpp
 2
 3 #include <ostream>
 4 #include <list>
 5 #include <string>
 6
 7 #include "boost/shared_ptr.hpp"
 8
 9 #include "BaseObserver.h"
10 #include "BaseSubject.h"
11
12 using namespace std;
13 using namespace boost;
14
15 class Secretary : public BaseSubject
16 {
17
18 };
19
20 class Boss : public BaseSubject
21 {
22
23 };
24
25 class StockObserver : public BaseObserver
26 {
27     public :
28        StockObserver(string name, basesubject_t sub) : BaseObserver(name, sub)
29         {
30
31         }
32
33        void CloseStock()
34         {
35             cout<<m_sub->m_subject_state<<m_name<<" 关闭CloseStock"<<endl;
36         }
37
38         void Update()
39         {
40             CloseStock();
41         }
42 };
43
44 class NBAObserver : public BaseObserver
45 {
46     public :
47        NBAObserver(string name, basesubject_t sub): BaseObserver(name, sub)
48         {
49         }
50
51         void Update()
52         {
53             CloseNBA();
54         }
55
56         void CloseNBA()
57         {
58             cout<<m_sub->m_subject_state<<m_name<<" 关闭NBA"<<endl;
59         }
60 };
61
62 typedef shared_ptr<Boss> boss_t;
63 typedef shared_ptr<Secretary> secretary_t;
64 typedef shared_ptr<StockObserver> stockobserver_t;
65 typedef shared_ptr<NBAObserver> nbaobserver_t;
66
67 int main(int argc, char** argv)
68 {
69     boss_t boss(new Boss());
70     secretary_t may(new Secretary());
71     stockobserver_t neo(new StockObserver("neo", may));
72     nbaobserver_t jason(new NBAObserver("jason", may));
73
74     may->m_subject_state = "老板回来啦! ";
75     may->Attach(neo);
76     may->Attach(jason);
77
78     (*may).Notify();
79
80
81 /*
82    boss->m_subject_state = "老板回来啦! ";
83     boss->Attach(neo);
84     boss->Attach(jason);
85 */
86     (*boss).Notify();
87
88     return 0;
89 }
时间: 2024-11-05 18:48:58

C++ 实现设计模式之观察者模式的相关文章

【设计模式】观察者模式

生活中,当某件事发生时,应该通知所有的相关者.例如,上课地点有变,要通知所有学习这门课的同学. 在软件设计中,当一个对象的状态发生变化是,如何通知与它相关的所有对象,就是我们今天要谈到的观察者模式. 观察者模式 概述 定义了一种一对多的依赖关系.让多个观察者对象同事监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己. 实际上,观察者模式所做的工作就是在解除耦合.让耦合的双方都依赖于抽象,而不是依赖于具体.从而使得各自的变化都不会影响另一边的变化. 结

设计模式:观察者模式

设计模式:观察者模式 : http://www.cnblogs.com/li-peng/archive/2013/02/04/2892116.html 观察者模式是我们经常用的一个模式,比如在用wcf做服务的时候通知客户端做一些操作一般用设计者模式. 今天做一个订报纸的小例子来理解一下观察者模式  出版者+订阅者=观察者模式 用下边的图来说就是    人民日报+订阅者=观察者模式 只要是订阅了人民日报的人,有了新报纸就会送到订阅者那里去, 当你不想订的时候取消就不订阅就不会再收到报纸了. //报

设计模式之-观察者模式

该文代码来自设计模式之惮一书. 观察者模式定义: 观察者模式也叫做发布订阅模式. 观察者模式中的角色: 1.被观察者 被观察者职责为管理观察者并通知观察者. 2.观察者 对接受到的消息进行处理. /// <summary> /// 被观察者 /// </summary> public abstract class Subject { /// <summary> /// 观察者集合 /// </summary> private List<IObserva

设计模式(16) 观察者模式(OBSERVER)C++实现

意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 动机: 将一个系统设计成一系列相互协作的类有一个常见的副作用:需要维护相关对象之间的一致性. 观察者模式定义一种交互,即发布-订阅: 一个对象当自身状态发生改变时,会发出通知,但是并不知道谁是他的接收者,但每个接收者都会接收到通知,这些接受者称为观察者. 作为对通知的响应,每个观察者都将查询目标状态,然后改变自身的状态以和目标状态进行同步. 使用场景: 使对象封装为独立的改变和使用:

&lt;&lt;Head First设计模式&gt;&gt;之观察者模式学习

1.概念 定义了对象之间的一对多依赖关系,当一个对象(主题对象)的状态改变时,它的所有依赖者(观察者对象)都会收到通知并自动更新. 2.优势 观察者模式实现了主题对象与观察者对象之间的松耦合,当有新的观察者时,无需修改主题对象的代码,只需要新的观察者对象实现接口.在程序运行的过程中,可以随时注册和删除观察者而不影响主体对象. 观察者模式使主题(Subject)对象和观察者(Observer)对象都可以被轻易地复用. 3.Java中观察者模式 Java API有内置的观察者模式,java.util

大话设计模式_观察者模式(Java代码)

观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们自己能够自动更新自己.简单描述:1个Subject类(可以是抽象类可以是接口),可以有多个具体Subject类(继承抽象Subject),此具体Subject持有多个观察者的引用,在此具体Subject状态发生变化的时候调用这些观察者的相应方法.另外,这些持有的引用是抽象的,不是具体的,而这些引用所指向的对象时具体的观察者(即需要作出更新的具体观察者,这些具体

设计模式-观察者模式(Observer Pattern)

今天看了看观察者模式,有点小小的体会,从以下3点说明之 : 1.看一下经典的观察者模式图 2.讲个故事,说一下逻辑 有一个男人(Subject),他通过一定的手段(attach)拥有了3个女人(Observer):老婆(concreteObserver1),情人(concreteObserver2),小3(concreteObserver3).这3个女人都不知情,但是都想知道男人的月收入情况.而月收入需要通过工资卡(concreteSubject)来体现.所以,每当发工资(setState)时,

常用设计模式之观察者模式 + 事件委托

常用设计模式之观察者模式 + 事件委托 作用及UML (摘自<大话设计模式>) Code 1 abstract class Subject{ 2 protected String state; 3 public void setState(String state){this.state = state;} 4 public String getState(){return this.state;} 5 6 private List<Observer> observers = ne

跟我学设计模式视频教程——观察者模式,迭代器模式

课程视频 观察者模式 迭代器模式 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--观察者模式,迭代器模式,布布扣,bubuko.com

设计模式之观察者模式C++实现

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 观察者模式结构图如下: 举例: 气象系统有三个部分分别是气象站(获取实际气象数据的物理装置),WeatherData对象(用来追踪来自气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看).WeatherData对象知道如何根物理气象站联系,以取得更新信息.WeatherData对象会随机更新三个布告板的显示:目前状况(温度,湿度,气压).气象统计和天气预报.我们的工作是建立一