您的位置:首页 > 其它

思考设计模式在自助终端软件上的应用 ——Observer(观察着)模式

2009-08-07 09:53 561 查看
主要思想:将各硬件模块作为观察者加入观察者队列,当机器状态改变时Notify所有观察者,各观察者根据消息类型做不同反应或不作反应。

下面贴出代码简单实现,希望引起圈内朋友的关注,起到抛砖引玉的效果。

下面两个类是两个基类.

class CObserver
{
public:
CObserver();
virtual ~CObserver();
public:
virtual void Update(HouEvent nEvent)=0;
};
class CSubject
{
public:
CSubject();
virtual ~CSubject();
public:
void Attach(CObserver * pObserver);      // 增加观察者
void Detach(CObserver * pObserver);      // 移除观察者
void NotifyAll(HouEvent nEvent);      // 通知

private:
list<CObserver*> m_ObserverList;
};


常用的状态,各设备接收到状态信息作出不同反应.

enum HouEvent
{
HOU_Powerup = 1001,    // 启动模式
HOU_InService,     // 服务模式
HOU_Suspend,     // 暂停服务
HOU_Maintenance,    // 维护模式
HOU_Closed,      // 关闭服务
};


以下是派生类:

class CMachine : public CSubject
{
public:
CMachine();
virtual ~CMachine();
void InitMachine();
void SetState(HouEvent nEvent);
// HouEvent GetState();
protected:
CCRP * m_pCRP;
CPIN * m_pPIN;
CRCW * m_pRCW;
};


下面是几个设备类,作为例子,只使用了3个设备,设备函数也只列举了几个:

class CCRP : public CObserver
{
public:
CCRP();
virtual ~CCRP();
public:
// 初始化
int InitDev();
// 重启
int Reset();
// 打印
int Print();
virtual void Update(HouEvent nEvent);
};
class CPIN : public CObserver
{
public:
CPIN();
virtual ~CPIN();
public:
// 初始化
int InitDev();
// 重启
int ResetDev();
// 输入密码
int InputPin();
// 输入明文
int InputClear();
virtual void Update(HouEvent nEvent);
};
class CRCW : public CObserver
{
public:
CRCW();
virtual ~CRCW();
public:
virtual void Update(HouEvent nEvent);
};


客户端代码:

void main()
{
// CSubject subject;

CMachine Machine;
Machine.InitMachine();
// Attach应该在CSubject的派生类里调
Machine.SetState(HOU_Powerup);
Machine.SetState(HOU_InService);
Machine.SetState(HOU_Maintenance);
}


稍微留一张以前做过的图
,:-)

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