觀察者模式是Symbian中使用非常多的一種模式 ,經過一天的研究,終於還是有點理解。
觀察者模式定義了對象間的一對多的依賴關係:當一個對象(目標對象)發生改變時,所有依賴於它的對象(觀察者)都能得到通知。
觀察者模式中的兩個關鍵對象是目標(Subject)和觀察者(Observer)。每個目標可以有一個或多個觀察者,目標提供了註冊和刪除觀察者對象的介面。具體的觀察者會實現目標中定義的獲得通知的介面,如觀察者介面Observer中定義的Update函數。當目標的狀態發生改變時,只需調用其基類中定義的Notify函數。該函數再調用每個觀察者的Updae函數。這樣,滅個具體的觀察者都會收到目標裝袋改變的通知,並且可以在其Update函數中實現其需要的行為。下面是在網上找到的C++實現代碼:
//介面<br />//ITransfer.h<br />#pragma once<br /> <br />class ITransfer<br />{<br />public:<br /> virtual bool DoTransfer(...) = 0;<br />};<br />class CFetionTransfer:public ITransfer<br />{<br />public:<br /> CFetionTransfer();<br /> ~CFetionTransfer();<br /> bool DoTransfer(...);<br />private:<br /> ......<br />};<br /> <br />class CMailTransfer: public ITransfer<br />{<br />public:<br /> CMailTransfer();<br /> ~CMailTransfer();<br /> bool DoTransfer(...);<br />private:<br />....<br />};<br /> <br />//TransferPool.h<br />#include "Transfer.h"<br />#include <vector><br />using namespace std;<br /> <br />class CTransferPool<br />{<br />private:<br /> vector<ITransfer*> vo;<br />public:<br /> virtual ~CTransferPool();<br /> <br /> void Login(ITransfer* po);<br /> <br /> void Logout(ITransfer* po);<br /> //向各成員廣播訊息<br /> void Notify(...);<br />};<br /> <br />//TransferPool.cpp<br />#include "TransferPool.h"<br /> <br /> <br />void CTransferPool::Login(ITransfer* po)//每一個需要通知的對象都添加進來<br />{<br /> vo.push_back(po);<br />}<br /> <br /> <br />void CTransferPool::Notify(...)<br />{<br /> vector<ITransfer*>::iterator vi = vo.begin();<br /> for (; vi != vo.end(); vi++)<br /> {<br /> ITransfer *s = *vi;<br /> <br /> (*vi)->DoTransfer(...);<br /> }<br />}<br /> <br />void main<br />{<br /> CTransferPool*m_pTranPool= new CTransferPool();<br /> <br /> CFetionTransfer *m_pFetionTran = new CFetionTransfer(...);<br /> CMailTransfer *m_pMailTran = new CMailTransfer(...);<br /> <br /> m_pTranPool->Login(m_pFetionTran);<br /> m_pTranPool->Login(m_pMailTran);<br /> <br /> while(需要發送訊息)<br /> {<br /> m_pTranPool->Notify();<br /> }<br /> <br /> ...... <br />}