设计模式之观察者模式(Observer) C++ 实践
2010-05-03 00:05
543 查看
在上一篇中简单的介绍了设计模式中Observer模式的java实现,本人一直在做C++开发,理所当然要做一个C++的实现版,
java基础基本是在学校拿下的,工作后偶尔玩下,android开发也是基于Java的,所以我熟悉java语言并不奇怪,仅仅是我没有做过
java的大型项目罢了,好了言归正传,这里的Observer c++版本也基本是参考java语言的接口,函数名字基本一样,只是我
采用了匈牙利命名规范,跟Java的命名规范稍有区别,下面是
被观察类,gof中称为目标类--subject
观察者:
下面将结合gof例子进行一个简单实现,这里就不再用product和consumer的例子了
定义一个CClockTimer:一个用于存储和维护一天时间的具体目标(subject)
定义一个CDigitalClock类来显示一个数字时钟
再定义一个CAnalogClock来显示一个模拟时钟
好了,我们现在已经有了两个观察者类的具体实现以及 一个Subject目标类,
他们的实现代码将在下一篇中给出,运行 的结果图:
java基础基本是在学校拿下的,工作后偶尔玩下,android开发也是基于Java的,所以我熟悉java语言并不奇怪,仅仅是我没有做过
java的大型项目罢了,好了言归正传,这里的Observer c++版本也基本是参考java语言的接口,函数名字基本一样,只是我
采用了匈牙利命名规范,跟Java的命名规范稍有区别,下面是
被观察类,gof中称为目标类--subject
// Observable.h #pragma once class CObserver; //观察者模式之被观察类(也称目标或者可观察类) class CObservable { public: CObservable(); virtual ~CObservable(); // 向对象的观察者集合添加此观察者。 void AddObserver(CObserver *pObserver); // 指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以HasChanged 方法将返回 false。 void ClearChanged(); // 返回 CObservable 对象的观察者数目。 int CountObservers(); // 测试对象是否改变。 bool HasChanged(); // 从对象的观察者集合中删除某个观察者。 void DeleteObserver(CObserver *pObserver); // 清除观察者列表,使此对象不再有任何观察者 void DeleteObservers(); // 如果 HasChanged 方法指示对象已改变,则通知其所有观察者,并调用 ClearChanged 方法来指示此对象不再改变。 void NotifyObservers(); // 如果 HasChanged 方法指示对象已改变,则通知其所有观察者,并调用 ClearChanged 方法来指示此对象不再改变。 void NotifyObservers(void *arg); // 标记此 CObservable 对象为已改变的对象;现在 HasChanged 方法将返回 true。 void SetChanged(); private: list<CObserver*> m_observers; bool m_bChanged; }; /////////////////////////////////////// //Observable.cpp #include "StdAfx.h" #include "Observer.h" #include "Observable.h" CObservable::CObservable(void) { m_bChanged=false; } CObservable::~CObservable(void) { DeleteObservers(); } void CObservable::AddObserver(CObserver *pObserver) { m_observers.push_back(pObserver); } void CObservable::ClearChanged() { m_bChanged=false; } int CObservable::CountObservers() { return m_observers.size(); } bool CObservable::HasChanged() { return m_bChanged; } void CObservable::DeleteObserver(CObserver *pObserver) { m_observers.remove(pObserver); } void CObservable::DeleteObservers() { m_observers.clear(); } void CObservable::NotifyObservers() { NotifyObservers(NULL); } void CObservable::NotifyObservers(void *arg) { if(m_bChanged) { list<CObserver*>::iterator iter; for(iter = m_observers.begin();iter!=m_observers.end();iter++) { (*iter)->Update(this,arg); } ClearChanged(); } } void CObservable::SetChanged() { m_bChanged = true; }
观察者:
// Observer.h #pragma once class CObservable; //观察者模式之观察者类 class CObserver { public: virtual ~CObserver(void); virtual void Update(CObservable *pObserable,void *arg)=0; protected: CObserver(void); }; ////////////////////////////////////// // Observer.cpp #include "StdAfx.h" #include "Observer.h" CObserver::CObserver(void) { } CObserver::~CObserver(void) { }
下面将结合gof例子进行一个简单实现,这里就不再用product和consumer的例子了
定义一个CClockTimer:一个用于存储和维护一天时间的具体目标(subject)
class CClockTimer:public CObservable
定义一个CDigitalClock类来显示一个数字时钟
class CDigitalClock : public CStatic,public CObserver
再定义一个CAnalogClock来显示一个模拟时钟
class CAnalogClock : public CStatic,public CObserver
好了,我们现在已经有了两个观察者类的具体实现以及 一个Subject目标类,
他们的实现代码将在下一篇中给出,运行 的结果图:
相关文章推荐
- 设计模式(16) 观察者模式(OBSERVER)C++实现
- c++设计模式:观察者模式(Observer Pattern)
- C++设计模式-Observer观察者模式
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- C++设计模式之观察者模式(Observer)
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- c++设计模式之Observer观察者模式
- 我所理解的设计模式(C++实现)——观察者模式(Observer Pattern)
- 设计模式C++学习笔记之十六(Observer观察者模式)
- c++ 设计模式5 (Observer / Event 观察者模式)
- 设计模式C++学习笔记之十六(Observer观察者模式)
- 设计模式之观察者(Observer)模式与其C++通用实现(中)
- C++设计模式-Observer观察者模式
- c++设计模式之观察者模式(observer)
- C++设计模式之十七--Observer观察者模型
- c++设计模式-----observer(观察者模式)
- C++设计模式之Observer(观察者)模式
- (Boolan)C++设计模式 <四> ——观察者模式(Observer)
- 设计模式C++学习笔记之十六(Observer观察者模式)
- 设计模式之观察者(Observer)模式与其C++通用实现(上)