设计模式之四-观察者模式
2012-11-13 13:29
281 查看
一 意图
它定义了一种一对多的依赖关系,当目标的状态发生改变时,所有的观察者都会得到通知而自动更新,不用实时的监控目标。二 别名
observer,依赖(depends),发布-订阅(Publish-Subsciribe)三 适用性
1 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中,以使得它们可以各自相互独立的改变和复用。2 当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变时。
3 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。
四 结构
五 实现
.h#ifndef __CLASS__H #define __CLASS__H #include <string> #include <list> using std::list; using std::string; class CSubject; class CObserver { public: virtual void Update(CSubject* subject)=0; virtual ~CObserver(){}; }; class CSubject { public: void Attach(CObserver* observer); void Detach(CObserver* observer); void Modify(); virtual ~CSubject(){}; virtual string GetState()=0; virtual void SetState(const string& state)=0; private: list<CObserver* > m_observerList; }; class CConcreteSubject:public CSubject { public: string GetState(); void SetState(const string& state); private: string m_state; }; class CConcreteObserverA:public CObserver { public: void Update(CSubject* subject); }; class CConcreteObserverB:public CObserver {; public: void Update(CSubject* subject); }; class CConcreteObserverC:public CObserver { public: void Update(CSubject* subject); }; #endif
.cpp
#include "class.h" #include <iostream> using namespace std; void CSubject::Attach(CObserver* observer) { m_observerList.push_back(observer); } void CSubject::Detach(CObserver* observer) { if(! m_observerList.empty() ) { m_observerList.remove(observer); } } void CSubject::Modify() { list<CObserver *>::iterator ite=m_observerList.begin(); for(;ite!=m_observerList.end();ite++) { (*ite)->Update(this); } } string CConcreteSubject::GetState() { return m_state; } void CConcreteSubject::SetState(const string& state) { m_state=state; } void CConcreteObserverA::Update(CSubject* subject) { string state=subject->GetState(); if(state == "yes") { cout<<"CConcreteObserverA is ready!\n"; } } void CConcreteObserverB::Update(CSubject* subject) { string state=subject->GetState(); if(state == "yes") { cout<<"CConcreteObserverB is ready!\n"; } } void CConcreteObserverC::Update(CSubject* subject) { string state=subject->GetState(); if(state == "yes") { cout<<"CConcreteObserverC is ready!\n"; } }
client:
#include "class.h" void main() { CSubject* pSubject=new CConcreteSubject(); CObserver* pA= new CConcreteObserverA(); CObserver* pB=new CConcreteObserverB(); CObserver* pC=new CConcreteObserverC(); pSubject->Attach(pA); pSubject->Attach(pB); pSubject->Attach(pC); pSubject->Detach(pB); pSubject->SetState("yes"); pSubject->Modify(); delete pSubject; delete pA; delete pB; delete pC; }
相关文章推荐
- 设计模式之观察者模式(c++)
- 观察者设计模式
- Java设计模式之行为型模式(观察者模式)
- 深入浅出设计模式之观察者模式
- 观察者设计模式
- 23种java设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- Java设计模式之Observer(观察者)模式
- 设计模式-观察者模式简单实例
- 设计模式之(Observer)观察者模式
- 设计模式之观察者模式(Observer)摘录
- 设计模式之观察者模式(二)
- 浅谈设计模式(java)——从lol来看观察者模式
- 设计模式之观察者模式
- 【原】从头学习设计模式(六)——观察者模式
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- Android设计模式系列--观察者模式
- 设计模式学习笔记(2):观察者模式(1)