主要思想:将各硬件模块作为观察者加入观察者队列,当机器状态改变时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); }
稍微留一张以前做过的图 ,:-)