主要思想:將各硬體模組作為觀察者加入觀察者隊列,當機器狀態改變時Notify所有觀察者,各觀察者根據訊息類型做不同反應或不作反應。
下面貼出代碼簡單實現,希望引起圈內朋友的關注,起到拋磚引玉的效果。
下面兩個類是兩個基類.
class CObserver<br />{<br />public:<br /> CObserver();<br /> virtual ~CObserver();<br />public:<br /> virtual void Update(HouEvent nEvent)=0;<br />};<br />class CSubject<br />{<br />public:<br /> CSubject();<br /> virtual ~CSubject();<br />public:<br /> void Attach(CObserver * pObserver); // 增加觀察者<br /> void Detach(CObserver * pObserver); // 移除觀察者<br /> void NotifyAll(HouEvent nEvent); // 通知</p><p>private:<br /> list<CObserver*> m_ObserverList;<br />};
常用的狀態,各裝置接收到狀態資訊作出不同反應.
enum HouEvent<br />{<br /> HOU_Powerup = 1001, // 啟動模式<br /> HOU_InService, // 服務模式<br /> HOU_Suspend, // 暫停服務<br /> HOU_Maintenance, // 維護模式<br /> HOU_Closed, // 關閉服務<br />};
以下是衍生類別:
class CMachine : public CSubject<br />{<br />public:<br /> CMachine();<br /> virtual ~CMachine();<br /> void InitMachine();<br /> void SetState(HouEvent nEvent);<br />// HouEvent GetState();<br />protected:<br /> CCRP * m_pCRP;<br /> CPIN * m_pPIN;<br /> CRCW * m_pRCW;<br />};
下面是幾個裝置類,作為例子,只使用了3個裝置,裝置函數也只列舉了幾個:
class CCRP : public CObserver<br />{<br />public:<br /> CCRP();<br /> virtual ~CCRP();<br />public:<br /> // 初始化<br /> int InitDev();<br /> // 重啟<br /> int Reset();<br /> // 列印<br /> int Print();<br /> virtual void Update(HouEvent nEvent);<br />};<br />class CPIN : public CObserver<br />{<br />public:<br /> CPIN();<br /> virtual ~CPIN();<br />public:<br /> // 初始化<br /> int InitDev();<br /> // 重啟<br /> int ResetDev();<br /> // 輸入密碼<br /> int InputPin();<br /> // 輸入明文<br /> int InputClear();<br /> virtual void Update(HouEvent nEvent);<br />};<br />class CRCW : public CObserver<br />{<br />public:<br /> CRCW();<br /> virtual ~CRCW();<br />public:<br /> virtual void Update(HouEvent nEvent);<br />};
用戶端代碼:
void main()<br />{<br />// CSubject subject;</p><p> CMachine Machine;<br /> Machine.InitMachine();<br /> // Attach應該在CSubject的衍生類別裡調<br /> Machine.SetState(HOU_Powerup);<br /> Machine.SetState(HOU_InService);<br /> Machine.SetState(HOU_Maintenance);<br />}
稍微留一張以前做過的圖
,:-)