观察者模式

2014-11-23 19:13:39 · 作者: · 浏览: 20
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。 vcfJq8v50qrH87XEuPzQwr3Tv9qjrNLUsePKubG+ye3XtMys0+vW98zitcTXtMysz+DQrbX3oaMKICAgICAgPHN0cm9uZz7TptPDuduy7NXfxKPKvbXEtq+7+rrNs6G+sDwvc3Ryb25nPgo8c3Ryb25nPravu/qjujwvc3Ryb25nPr2r0ru49s+1zbO31rjus8nSu8+1wODP4Lul0K3X97XEwODT0NK7uPa63LK7usO1xLix1/fTw6OsxMe+zcrH0OjSqs6su6TP4LnYttTP87XE0rvWwtDUoaPOqsHLzqy7pNK71sLQ1Mq5z+C52MDgvfTD3LXE8e66z9Ta0rvG8Lj4zqy7pKGiwKnVubrN1tjTw7a8tPjAtMHLsrux46Gjuduy7NXfxKPKvcv51/a1xL7Nyse94vHuoaMKPHN0cm9uZz6zob6wo7o8L3N0cm9uZz4KCjxvbD4KtbHSu7j2ttTP87XEuMSx5NDo0qrNrMqxuMSx5Mbky/u21M/ztcTKsbryoaO2+MfSsrvWqrXAvt/M5dPQtuDJ2bbUz/PT0LT9uMSx5Mqxo6zTprjDv7zCx8q508O527Ls1d/Eo8q9oaO1sdK7uPaz6c/zxKPQzdPQwb249re9w+ajrMbk1tDSu7e9w+bSwMC109rB7dK7t73D5qOs1eLKsdPDuduy7NXfxKPKvb/J0tS9q9Xiwb3V37fi17DU2rbAwaK1xLbUz/PW0Mq5y/vDx7j319S2wMGitcS4xLHkus24tNPDoaMKICAgICAgIL3i8e6+zcrHyMPx7rrPtcTLq7e9trzSwMC109qz6c/zo6y2+LK7ysfSwMC109q+38zloaO007b4yrm1w7j319S1xLHku6+2vLK7u+HTsM/swe3Su7HftcSx5LuvoaMKPGJyPgoKtPrC66O6Ci8vT2JzZXJ2ZXIuaAo8cHJlIGNsYXNzPQ=="brush:java;">#include "stdafx.h" #include #include #include using namespace std; class Observer { public: virtual void Update() = 0; virtual ~Observer(){} }; class Subject { public: virtual ~Subject(){} virtual void Attach(Observer* observer) { _observers.push_back(observer); } virtual void Detach(Observer* observer) { vector ::iterator it = find(_observers.begin(), _observers.end(), observer); _observers.erase(it); } virtual void Notify() { for each (Observer* o in _observers) { o->Update(); } } private: vector _observers = vector (); }; class ConcreteSubject :public Subject { public : ~ConcreteSubject(){} string SubjectState; }; class ConcreteObserver :public Observer { private: string _name; string _ObserverState; ConcreteSubject *_pSubject; public: ConcreteObserver( ConcreteSubject *subject, string name) { _pSubject = subject; _name = name; } virtual void Update() { _ObserverState = _pSubject->SubjectState; cout << "观察者:"<<_name<<" 当前状态:"<<_ObserverState << endl; } }; //ObserverPattern.cpp
// ObserverPattern.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Observer.h"

int _tmain(int argc, _TCHAR* argv[])
{
	ConcreteSubject *s = new ConcreteSubject();
	s->Attach(new ConcreteObserver(s, "x"));
	s->Attach(new ConcreteObserver(s, "y"));
	s->SubjectState = "老板回来了";
	s->Notify();
	getchar();
	return 0;
}