学习设计模式--观察者模式(C++)

1. 说说简单的函数回调

首先说说一种简单的函数回调机制(一种通过获取对象的指针来进行函数的调用方法)以下是代码演示---

这是观察者(被回调)部分:

class Observer
{
public:
	// 抽象观察者的纯虚函数
	virtual void UpdateMessage() = 0;
};

class ConcreteObserver : public Observer
{
public:
	// 实现抽象类的纯虚函数
	void UpdateMessage();
}

void ConcreteObserver::UpdateMessage()
{
	// 这里实现详细的操作
}

class Subject
{
public:
	Subject(Observer* observer = NULL);

	void OnMessageChanged();

private:
	Observer* m_observer;
};

以下是被观察者(主动调用)部分:

Subject::Subject(Observer* observer)
{
	// 将Observer的对象指针传进来并复制
	m_observer = observer;
}

void Subject::OnMessageChanged()
{
	if(m_observer)
	{
		// 通过多态机制下的指针回调观察者的函数
		m_observer->UpdateMessage();
	}
}

如上所看到的,程序中的一个对象通过获取还有一个对象的指针,来进行函数的调用。这不是类之间的直接调用,仅仅因该对象指针是在多态下定义的。

进一步拓展,假设有一个或多个多个观察者来关注一个或多个对象,那么就能够用通常所说的观察者模式来实现了。

2. 观察者模式的应用场合和特点

观察者模式一般出如今这种场合:存在观察者和被观察对象。详细样例,比方订阅邮件或杂志, 微博关注某某主题等。当你在微博上关注了某个主题后,当这个主题有新的信息发出来时,你的微博主页将会对应收到它的更新信息。

而观察者模式提供了这种一个对象模型,使得对象们(主题和观察者)之间松耦合:

(1)观察者的更替或数据模块的更新不会影响主题的存在。

(2)观察者和主题类能够方便的独立地被程序其它模块使用。

(3)一个主题能够注冊多个观察者,也能够动态删除观察者; 一个观察者也能够注冊多个主题,也能够撤销注冊。

比如一份天气预报能够被多个用户订阅,当数据更新时会通知全部注冊的用户。一个用户也能够订阅多份天气预报,广州的,珠海的等等。

3.简单的代码演示

(1)演示的功能能够用这个类图来表达,类图中定义了Subject和Observer两个接口,并定义了两个详细主题类和三个详细观察者类。

(2)详细代码实现

首先是主题类,分别定义了类ConcreteSubjectA和类ConcreteSubjectB。

class Subject
 {
 public:
     virtual void registerObserver(shared_ptr<Observer> observer) = 0;
     virtual void removeObserver(shared_ptr<Observer> observer) = 0;
     virtual void notifyObserver() = 0;
 };

 class ConcreteSubjectA : public Subject
 {
 public:
      ConcreteSubjectA()
     {
	     // do something here
		 testValue = 1;
     }

     void registerObserver(shared_ptr<Observer> observer)
     {
         observersList.push_back(observer);
     }
     void removeObserver(shared_ptr<Observer> observer)
     {
         observersList.remove(observer);
     }

     void notifyObserver()
     {
         for (list<shared_ptr<Observer> >::iterator it = observersList.begin();
             it != observersList.end(); ++it)
         {
             (*it)->updateData(testValue);
         }
     }

 private:
     list<shared_ptr<Observer> > observersList;
	 int testValue;
 };

 class ConcreteSubjectB : public Subject
 {
 public:
      ConcreteSubjectB()
     {
	     // do something here
		 testValue = 2;
     }

     void registerObserver(shared_ptr<Observer> observer)
     {
         observersList.push_back(observer);
     }
     void removeObserver(shared_ptr<Observer> observer)
     {
         observersList.remove(observer);
     }

     void notifyObserver()
     {
         for (list<shared_ptr<Observer> >::iterator it = observersList.begin();
             it != observersList.end(); ++it)
         {
             (*it)->updateData(testValue);
         }
     }

 private:
     list<shared_ptr<Observer> > observersList;
	 int testValue;
 };

接着是观察者类,分别定义了类ConcreteObserverA,类ConcreteObserveB,类ConcreteObserverC。

class Observer
 {
 public:
     virtual void updateData(int val) = 0;
 };

 class ConcreteObserverA : public Observer
 {
 public:
     void updateData(int val)
     {
		// do something here
         cout << "In A :" << val <<endl;
     }
 };

 class ConcreteObserverB : public Observer
 {
 public:
     void updateData(int val)
     {
		// do something here
         cout << "In B :" << val <<endl;
     }
 };

 class ConcreteObserverC : public Observer
 {
 public:
     void updateData(int val)
     {
		// do something here
         cout << "In C :" <<val <<endl;
     }
 };

然后,我们能够这样使用他们:

 int main()
 {
     shared_ptr<Subject> subjectA(new ConcreteSubjectA());
     shared_ptr<Subject> subjectB(new ConcreteSubjectB()); 

     shared_ptr<Observer> observerA(new ConcreteObserverA());
     shared_ptr<Observer> observerB(new ConcreteObserverB());
     shared_ptr<Observer> observerC(new ConcreteObserverC()); 

     subjectA->registerObserver(observerA);
     subjectA->registerObserver(observerB);
     subjectB->registerObserver(observerC); 

	 // 主题A有更新时将通知观察者A,B
     subjectA->notifyObserver();
	 // 主题B有更新时将通知观察者C
	 subjectB->notifyObserver();

     return 0;
 }

学习设计模式--观察者模式(C++),布布扣,bubuko.com

时间: 2024-10-08 18:08:02

学习设计模式--观察者模式(C++)的相关文章

设计模式学习之观察者模式(Observer,行为型模式)(7)

1.观察者模式又叫做发布-订阅模式. 2.观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己. 3.使用观察者模式的好处:维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧密耦合,这样会给维护.扩展和重用都带来不便.什么时候使用观察者模式:当一个对象的改变需要同时改变其他对象的时候,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式. private static void M

【C++深入浅出】设计模式学习之观察者模式

前言 前两天学习了weak_ptr以后还是不甚明了,一则需要实际应用去锤炼,二来就是不懂观察者模式. 正文 观察者模式又叫发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题对象在状态发生改变时,会通知所有的观察者对象,使他们能够自动更新自己. 通过一张visio的UML图片介绍一下子功能关系. subject类:抽象通知者类,一般用一个抽象类或者接口实现,把所有对观察者的引用都放到一个集合里,每个抽象通知者类可以有任意数量的观察者,抽象通知者类提供一个接口

《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式

装饰者模式是JDK中另一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源码,也是为了学习大牛们的设计思路.----题记 设计模式 观察者模式:定义了对象之间一对多的依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新. 装饰者模式:动态地将责任附加到对象上.若要扩展功能,装饰者提供比继承者更有弹性的替代方案. 设计原则 (1)封装变化. (2)多用组合,少用继承. (3)针对接口编程,而不是

一口一个设计模式--观察者模式

5月初,我们三个小伙伴开始着手准备机房收费系统合作版,借此大好良机,我准备把设计模式写成一个博客专栏,站在一个更高的角度品味前人的思想精髓.设计模式分为三类--创建型.结构型.行为型,咱们就先从行为型模式--观察者模式开讲. 开讲之前,我先给大家讲个小故事,以便大家快速认识观察者模式.在战争年代,战争双方不时受到敌军飞机的轰炸,于是人们发明了航空警报,并派几个侦察兵放哨,一但敌机来临,立即拉响航空警报,这样所有的收听者就能听到报警逃跑.上述情节,看似平常,其实是观察者模式是完美体现.下图是针对上

Java设计模式----观察者模式详解

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3899208.html 联系方式:[email protected] [正文] 一.观察者模式的定义: 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象.这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新.例如:GUI中的事件

再看设计模式——观察者模式

随着软考的进行,开始了新一轮设计模式的学习,距离上一次这种整体.从头到尾学习设计模式已经有一段时间了.上次整体上的学习中,主要是了解,简单的使用设计模式.随着这一段时间的接触,潜移默化,这次的学习,相对深入一些.下面我以观察者模式为例,记录一下这次设计模式的学习.(以Head First 设计模式为主要材料). 1.复习什么是观察者模式 我们看看报纸和杂志的订阅是怎么回事:报社的业务就是出版报纸向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来.只要你是他们的订户,你就会一直收到新报纸当你不

如何学习设计模式

GoF的[设计模式]是经典著作,有人看了好多遍仍然说没有看懂,许多人看懂了一些模式但不知道如何应用--这里,yqj2065抛砖引玉,讨论一下如何学习设计模式. ①    学习技巧 学习设计模式时,有一些技巧能够帮助你快速理解设计模式. a)        使用较简单的面向对象的语言如Java.C#.GoF的[设计模式]实质上是面向对象的设计模式.[GoF·1.1]中提到"程序设计语言的选择非常重要,它将影响人们理解问题的出发点".从学习设计模式的角度看,Java和C#较C++更容易一些

【转】设计模式-观察者模式

设计模式-观察者模式 定义 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或 从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各 观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 基本简介 观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务 数据是被观察

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

观察者模式(Observer Pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权所有, 禁止转载, 如有转载, 请站内联系. 观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove