首页 > 代码库 > 设计模式之: 观察者模式
设计模式之: 观察者模式
观察者模式(Observer)完美的将观察者和被观察的对象分离开。
举个简单的例子,有的时候我们在学校,班长要收集我们班成员填写的表格,那班长肯定不能一个个找我们来收,那这样估计没人肯做班长了,当然是我们自己交给他,但是我们如何知道要交给他呢,总不能我们40个人不停地问他吧,那正常人都会想到,班长给我们每个人发个消息,我们就去交给他就行,在这个模式中,班长属于被观察者,我们属于观察者,所以可以用观察者模式来处理。
UML图如下:
Subject(被观察者)
——目标知道它的观察者。可以有任意多个观察者观察同一个目标;
——提供注册和删除观察者对象的接口。
Observer(观察者)
——为那些在目标发生改变时需获得通知的对象定义一个更新接口。
ConcreteSubject(具体目标)
——将有关状态存入各ConcreteObserver对象;
——当它的状态发生改变时,向它的各个观察者发出通知。
Observer1,Observer2(具体观察者)
——维护一个指向ConcreteSubject对象的引用;
——存储有关状态,这些状态应与目标的状态保持一致;
——实现Observer的更新接口以使自身状态与目标的状态保持一致。
代码如下:
/* *@author: LiuCimin *web: http://blog.csdn.net/liucimin/ *mail: lcmjk@foxmail.com *2014-9-24 */ #include <iostream> #include <vector> #include <string> using namespace std; class Observer; //被观察者 class Subject { public: virtual void Attach(Observer *) = 0; virtual void Detach(Observer *) = 0; virtual void Notify() = 0; virtual string GetState()=0; }; //观察者 class Observer { public: virtual void Update() = 0; }; //观察者1 class Observer1 : public Observer { public: Observer1(Subject *pSubject) : m_pSubject(pSubject){} void Update() { cout<<"Observer1 get the update. New State:"<<m_pSubject->GetState()<<endl; } private: Subject *m_pSubject; }; //观察者2 class Observer2 : public Observer { public: Observer2(Subject *pSubject): m_pSubject(pSubject){} void Update() { cout<<"Observer2 get the update. New State:"<<m_pSubject->GetState()<<endl; } private: Subject *m_pSubject; }; //具体被观察者 class ConcreteSubject : public Subject { public: void Attach(Observer *pObserver); void Detach(Observer *pObserver); void Notify(); void SetState(string state) { m_iState = state; } string GetState() { return m_iState; } private: vector<Observer *> ObserverList; string m_iState; }; void ConcreteSubject::Attach(Observer *pObserver) { ObserverList.push_back(pObserver); } void ConcreteSubject::Detach(Observer *pObserver) { vector<Observer*>::iterator p=ObserverList.begin(); while(*p!=pObserver) { ++p; } ObserverList.erase(p); } void ConcreteSubject::Notify() { vector<Observer *>::iterator it = ObserverList.begin(); while (it != ObserverList.end()) { (*it)->Update(); ++it; } } int main() { // Create Subject ConcreteSubject *pSubject = new ConcreteSubject(); // Create Observer Observer *pObserver1 = new Observer1(pSubject); Observer *pObserver2 = new Observer2(pSubject); // Change the state pSubject->SetState("上交名单"); // Register the observer pSubject->Attach(pObserver1); pSubject->Attach(pObserver1); pSubject->Notify(); // Unregister the observer pSubject->Detach(pObserver1); pSubject->SetState("填写表格"); pSubject->Notify(); delete pObserver1; delete pObserver2; delete pSubject; }
设计模式之: 观察者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。