您的位置:首页 > 编程语言 > C语言/C++

设计模式之观察者模式(Observer) C++ 实践

2010-05-03 00:05 543 查看
在上一篇中简单的介绍了设计模式中Observer模式的java实现,本人一直在做C++开发,理所当然要做一个C++的实现版,

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目标类,

他们的实现代码将在下一篇中给出,运行 的结果图:

 



 

 

 

 

 

 

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息