设计模式读书笔记:Observer(观察者)

原创 2015年07月10日 21:18:45

意图:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

结构图:来自 《23种设计模式 - 郗晓勇》


实现:https://github.com/panshiqu/patterns/tree/master/Observer

Observer

namespace NS_OBSERVER {

class Observer {
public:
	Observer() {}
	virtual ~Observer() {}
	virtual void update(void) = 0;
};

} /* namespace NS_OBSERVER */
ConcreteObserver

#include <iostream>
#include "Observer.h"
#include "ConcreteSubject.h"

namespace NS_OBSERVER {

class ConcreteObserver : public Observer
{
public:
	ConcreteObserver(ConcreteSubject *subject) : _observerState(false), _subject(subject)
	{
		_subject->attach(this);
	}

	virtual ~ConcreteObserver()
	{
		_subject->detach(this);
	}

	virtual void update(void)
	{
		_observerState = _subject->getSubjectState();
		std::cout << "State: " << _observerState << std::endl;
	}

private:
	bool _observerState;
	ConcreteSubject *_subject;
};

} /* namespace NS_OBSERVER */
Subject

#include <list>
#include <iostream>
#include "Observer.h"

namespace NS_OBSERVER {

class Subject {
public:
	Subject() {}
	virtual ~Subject()
	{
		_observers.clear();
	}

	void attach(Observer *observer)
	{
		// 多线程这里的链表操作考虑加锁
		_observers.push_back(observer);
	}

	void detach(Observer *observer)
	{
		// 多线程这里的链表操作考虑加锁
		_observers.remove(observer);
	}

	void notify(void)
	{
		// 多线程这里的链表操作考虑加锁
		std::list<Observer *>::iterator itr = _observers.begin();
		for (; itr != _observers.end(); itr++)
		{
			(*itr)->update();
		}
	}

private:
	std::list<Observer *> _observers;
};

} /* namespace NS_OBSERVER */
ConcreteSubject

#include "Subject.h"

namespace NS_OBSERVER {

class ConcreteSubject : public Subject
{
public:
	ConcreteSubject() : _subjectState(true) {}
	virtual ~ConcreteSubject() {}

	bool getSubjectState(void)		{ return _subjectState; }
	void setSubjectState(bool subjectState)	{ _subjectState = subjectState; }

private:
	bool _subjectState;
};

} /* namespace NS_OBSERVER */
main

#include "Observer/ConcreteSubject.h"
#include "Observer/ConcreteObserver.h"
using namespace NS_OBSERVER;
int main(void)
{
	// 简单的拉模型:Observer仅接受通知,然后主动向Subject要状态
	// 若是推模型,则要扩展Update接口了
	ConcreteSubject cs;
	ConcreteObserver co1(&cs);
	ConcreteObserver co2(&cs);
	cs.notify();
}
附加:

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

读书笔记_java设计模式深入研究 第五章 观察者模式 Observer

1,观察者模式适合解决多种对象跟踪一个对象数据变化的程序结构问题,一个称作“主题”的对象和若干个称作“观察者”的对象。在主题对象更新后会通知所有的观察者,使他们自动更新自己。 2,观察者UML类...

设计模式(19)—— Observer (观察者)

观察者模式是什么? 观察者模式定义了对象间一种一对多的依赖关系。当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式的适用范围 1. 一个抽...

java设计模式_观察者Observer(一)

观察者设计模式

Observer(观察者)设计模式代码实现

观察者模式又叫发布-订阅模式 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个注意对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己   p...

Observer(观察者)设计模式

Objective-C中的Observer模式实现在我们的iOS开发中,很幸运,Cocoa架构中已经提供了消息中心组件来实现Observer模式。 NSNotificationCenter NSN...

《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:时钟

示例:时钟 说明: ClockTimer是一个用于存储和维护一天时间的具体目标。它每秒钟通知一次它的观察者。 我们定义一个DigitalClock类来显示时间。...

iOS中的observer(观察者设计模式)swift版

观察者模式 - Observer 在观察者模式里,一个对象在状态变化的时候会通知另一个对象。参与者并不需要知道其他对象的具体是干什么的 - 这是一种降低耦合度的设计。这个设计模式常用于在某个属性改变...

观察者设计模式(Observer Pattern)

GOF设计模式 Observer Pattern 观察者设计模式 观察者模式比喻 • 想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了,tom负责搜集情报,他发现的新情报不用一个一个通知...

Java常用类库--观察者设计模式( Observable类Observer接口)

如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口。 [java] view plaincopy import jav...

《GOF设计模式》—观察者(OBSERVER)—Delphi源码示例:显式地指定感兴趣的改变

示例:显式地指定感兴趣的改变 说明: 你可以扩展目标的注册接口,让各观察者注册为仅对特定事件感兴趣,以提高更新的效率。当一个事件发生时,目标仅通知那些已注册为对该事件感兴趣的观察者。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:Observer(观察者)
举报原因:
原因补充:

(最多只允许输入30个字)