设计模式之观察者模式学习笔记

Posted u012507022

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者模式学习笔记相关的知识,希望对你有一定的参考价值。

1、定义 

定义对象间的一种一对多的依赖关系 ,让多个观察者对象同时监听某一个主题对象,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新,又叫发布-订阅(publish-subscribe)模式。 


2、解决问题

在以下任一情况下可以使用观察者模式:
(1)当一个抽象模型有两个方面 ,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
(2)当对一个对象的改变需要同时改变其它对象 , 而不知道具体有多少对象有待改变。
(3)当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之 , 你不希望这些对象是紧密耦合的。 

3、模式结构图

Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
Subject (抽象主题,抽象通知者) :该角色是一个抽象类或接口,它把所有对观察者的引用保存在一个聚集里,每个通知者都可以有任何数量的观察者,定义了增加、删除、通知观察者对象的方法。
ConcreteSubject(具体主题,具体通知者):将有关状态存入各ConcrereObserver对象,当它的状态发生改变时 , 向它的各个观察者发出通知。

 

4、demo 

(1)在教室里老师还没有来,同学都在干着各的事情,小张正在打游戏,小李正在抄作业,  现在同学们要求班长当卧底,监视老师,当老师来了通知大家一声。然后打游戏的马上停止,抄作业的也停止。
这里班长相当于是一个通知者, 小张、小李,以及其他同学显然是观察者,他们监听了班长那的消息,一旦老师来了马上采取相关的行动。

(2)对同一组数据进行统计分析时候, 我们希望能够提供多种形式的表示 (例如以表格进行统计显示、柱状图统计显示、百分比统计显示等)。这些表示都依赖于同一组数据, 我们当然需要当数据改变的时候, 所有的统计的显示都能够同时改变。
 

#include"iostream"
#include"list"
#include"string"

using namespace std;

class Subject;

/*抽象观察者,为所有具体观察者定义一个接口,在得到主题的通知时更新自己
如,干着各种事情的同学*/
class AbsObserver

public:
	AbsObserver(string name, Subject* sub)
	
		this->name = name;
		this->subject = sub;
	

	virtual void update(int value) = 0;

protected:
	string name;
	Subject* subject;
;

/*具体观察者*/
class PlayGameStu :public AbsObserver

public:
	PlayGameStu(string name, Subject* sub) :AbsObserver(name, sub) 

	void update(int value)
	
		stopPlayGame(value);
	

	void stopPlayGame(int value)
	
		cout << name << "stopPlayGame" << endl;
	

;

class CopyWorkStu :public AbsObserver

public:
	CopyWorkStu(string name, Subject* sub) :AbsObserver(name, sub) 

	void update(int value)
	
		stopCopyWork(value);
	
	void stopCopyWork(int value)
	
		cout << name << "stopCopyWork" << endl;
	
;

//抽象主题,通知者、班长
class Subject

public:
	virtual void addObserver(AbsObserver *observer) = 0;
	virtual void removeObserver(AbsObserver *observer) = 0;
	virtual void notify() = 0;

	void setState(int value)
	
		stateTeacher = value;
		printf("当前状态:%d\\n", value);
		notify();
	

protected:
	list<AbsObserver*> observers;
	int stateTeacher;  //老师状态
;

/*(具体主题,通知者、班长):该角色继承或实现了抽象主题,定义了一个集合存入注册过的具体观察者对象,
在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知*/
class ConcreteSubject :public Subject

public:
	void addObserver(AbsObserver *observer)
	
		observers.push_back(observer);
	

	void removeObserver(AbsObserver *observer)
	
		list<AbsObserver*>::iterator it;
		for (it = observers.begin(); it != observers.end(); it++)
		
			if (*it == observer)
			
				observers.remove(observer);
				break;
			
		
	

	void notify()
	
		list<AbsObserver*>::iterator it;

		for (it = observers.begin(); it != observers.end(); it++)
		
			(*it)->update(stateTeacher);
		
	

;


int main()

	//
	Subject* subject = new ConcreteSubject;

	AbsObserver* stuPG = new PlayGameStu("xiaoming", subject);
	AbsObserver* stuCW = new CopyWorkStu("xiaoli", subject);

	//
	subject->addObserver(stuPG);
	subject->addObserver(stuCW);

	subject->setState(1);
	
	subject->setState(2);

	return 0;


 

以上是关于设计模式之观察者模式学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

观察者模式和java委托

设计模式之观察者模式

[GeekBand] 设计模式之观察者模式学习笔记

Java学习笔记——设计模式之十.观察者模式

设计模式之观察者模式学习笔记

设计模式之观察者模式学习笔记