您的位置:首页 > 其它

思考设计模式在自助终端软件上的应用 ——Observer模式

2009-03-16 22:04 387 查看
主要思想:将各硬件模块作为观察者加入观察者队列,当机器状态改变时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);
}

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