设计模式笔记之---观察者模式
来源:互联网 发布:电视棒软件安卓版 编辑:程序博客网 时间:2024/05/01 04:16
观察者模式(Observer):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
实现过程:
1.观察者(Observer)将自己注册到被观察对象(Observer)中,被观察对象将观察者存放在一个列表(List)中。
2.被观察对象(Subject)发生了某种变化时,自动从容器中遍历所有注册过的观察者,将变化通知依次所有注册的观察者。
3.观察者(Observer)告诉被观察者(Observer)要撤销观察,被观察者从列表中将观察者去除。
一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。被观察着发出通知时,不需要知道谁是它的观察者。观察者和被观察者用松耦合的方式结合,被观察者不知道观察者的细节,只要这个观察者也是相同的接口实现即可。
UML类图:
观察者模式基本代码如下:
/******************************************************************** filename: Observer.hcreated: 2012-09-25 author: firehood purpose: firehood 学设计模式之---观察者模式 *********************************************************************/#pragma once#include "windows.h"#include <assert.h>#include <iostream>#include <string>#include <list>#include <algorithm>using namespace std;// 抽象观察者class Observer{public:Observer(void){}virtual ~Observer(void){}virtual void Update() = 0;};// 抽象被观察者class Subject{public:Subject(void){m_ObserverList.clear();}virtual ~Subject(void){}virtual BOOL Attach(Observer *pObserver){if(pObserver == NULL){return FALSE;}if(std::find(m_ObserverList.begin(),m_ObserverList.end(),pObserver) != m_ObserverList.end()){return FALSE;}m_ObserverList.push_back(pObserver);return TRUE;}virtual BOOL Detach(Observer *pObserver){if(pObserver == NULL){return FALSE;}m_ObserverList.remove(pObserver);return TRUE;}virtual void Notify(void){list<Observer*>::iterator iter;for(iter = m_ObserverList.begin();iter != m_ObserverList.end(); iter++){(*iter)->Update();}}private:list<Observer*> m_ObserverList;};typedef string STATE;// 具体被观察者class ConcreteSubject: public Subject{public:ConcreteSubject(){};virtual ~ConcreteSubject(){};BOOL SetState(STATE SubjectState){if(m_SubjectState != SubjectState){m_SubjectState = SubjectState;}cout<<"设置被观察者状态:"<<m_SubjectState<<endl;return TRUE;}STATE GetState(){return m_SubjectState;}private:STATE m_SubjectState;};// 具体观察着class ConcreteObserver: public Observer{public:// 构造时需指定具体的被观察者ConcreteObserver(ConcreteSubject *pSubject):m_pSubject(NULL){assert(pSubject);m_pSubject = pSubject;};virtual ~ConcreteObserver(){}virtual void Update(){m_ObserverState = m_pSubject->GetState();cout<<"观察者"<<this<<":被观察者状态改变:"<<m_ObserverState<<endl;}private:ConcreteSubject* m_pSubject;STATE m_ObserverState;};
客户端调用代码如下:
#include "Observer.h"#include <iostream>using namespace std;int main(int argc,char* argv[]){cout<<"*************************************"<<endl;cout<<"firehood 学设计模式之---观察者模式"<<endl;cout<<"*************************************"<<endl; // 声明被观察者ConcreteSubject Subject;// 创建观察者A,观察的对象为SubjectConcreteObserver *pObserverA = new ConcreteObserver(&Subject);Subject.Attach(pObserverA);// 创建观察者B,观察的对象为SubjectConcreteObserver *pObserverB = new ConcreteObserver(&Subject);Subject.Attach(pObserverB);Subject.SetState("状态1"); Subject.Notify();Subject.SetState("状态2");Subject.Notify();delete pObserverA;delete pObserverB;system("pause");return 0;}
运行结果:
*************************************
firehood 学设计模式之---观察者模式
*************************************
设置被观察者状态:状态1
观察者003A6530:被观察者状态改变:状态1
观察者003A65E0:被观察者状态改变:状态1
设置被观察者状态:状态2
观察者003A6530:被观察者状态改变:状态2
观察者003A65E0:被观察者状态改变:状态2
请按任意键继续. . .
- 设计模式笔记之观察者
- 学习笔记 ---- 设计模式之观察者模式
- 设计模式之观察者模式学习笔记
- 设计模式学习笔记之观察者模式
- 设计模式笔记之---观察者模式
- 设计模式笔记之观察者模式
- Java设计模式笔记之观察者模式
- 设计模式学习笔记之观察者模式
- 设计模式学习笔记之观察者模式
- 设计模式学习笔记之观察者模式
- 设计模式之禅笔记-观察者模式
- 设计模式之观察者模式--慕课网笔记
- 设计模式之观察者模式-笔记
- 设计模式 笔记 观察者模式
- 设计模式笔记--观察者模式
- 设计模式笔记-观察者模式
- 设计模式笔记--观察者模式
- 设计模式笔记:观察者模式
- Linux C调用C++库
- Android之PreferenceActivity
- C++编程之内存和指针
- C/C++ 误区二:fflush(stdin)
- MSF命令小记
- 设计模式笔记之---观察者模式
- ios 编程日记 2:如何在terminal下打开一个工程
- SAP PO PRICE
- struts2配置文件中result返回类型
- SQL SERVER 获取某一行中最大值/最小值方法收集
- .Net之NVelocity的三种用法
- [转]__attribute__机制介绍
- struts2验证框架后台验证用户注册 .
- android调节音量——AudioManager的应用