现在的位置: 首页 > 综合 > 正文

设计模式——观察者模式_Observer Pattern

2013年05月27日 ⁄ 综合 ⁄ 共 1356字 ⁄ 字号 评论关闭

观察者模式

        Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. (定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)

UML类图

C++代码实现

#include <iostream>
#include <list>
using namespace std;

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

class ConcreteObserverA : public Observer {
public:
	void Updata() { cout << "观察者A已经被通知到更新" << endl; }
};

class ConcreteObserverB : public Observer {
public:
	void Updata() { cout << "观察者B已经被通知到更新" << endl; }
};

class Subject {
public:
	virtual void AddObserver(Observer* obs) { _observers.push_back(obs); }
	virtual void DelObserver(Observer* obs) { 
		if (obs!=NULL)
			_observers.remove(obs); 
	}
	virtual void Notify() = 0;

protected:
	list<Observer*> _observers;
};

class ConcreteSubject : public Subject {
public:
	void Notify() {
		typedef list<Observer* >::iterator ListIter;
		for (ListIter iter=_observers.begin(); iter!=_observers.end(); iter++) {
			(*iter)->Updata();
		}
	}

	void DoSomething() { 
		cout << "被观察者进行了某项操作" << endl; 
		Notify();
	}
};


#include "Observer.h"

int main()
{
	//观察者
	ConcreteObserverA* pObserverA = new ConcreteObserverA();
	ConcreteObserverB* pObserverB = new ConcreteObserverB();
	//被观察者
	ConcreteSubject* pSubject = new ConcreteSubject();
	pSubject->AddObserver(pObserverA);
	pSubject->AddObserver(pObserverB);

	pSubject->DoSomething();

	delete pSubject;
	delete pObserverB;
	delete pObserverA;
	return 0;
}

原来所谓的观察行为必须是得到被观察者同意的前提下才能进行。被观察者若是暴露狂则可以引发围观现象。但要是形成广播链的情况处理起来就棘手了,比如观察者同时又是被观察者的双重身份。

抱歉!评论已关闭.