設計模式----Observer模式
轉自:http://blog.csdn.net/fly542/article/details/6716825
在以下任一情況下可以使用觀察者模式:
1、當一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這二者封裝在獨立的物件中以使他們可以各自獨立的改變和複用
2、當對一個物件的改變需要同時改變其他物件,而不知道具體有多少物件有待改變。
3、當一個物件必須通知其它物件,而它又不能假定其它物件是誰。(即:不希望這些物件是緊密耦合的)
結構思想個人理解核心內容,要想記住這個模式簡單的方式就記住三個迴圈箭頭,從右下開始ConcreteObserver----->ConcreteSubject-------->Subject-------->Observer。
首先說明的是,此模式主要是想通過一個物件改變通知其他物件(observer物件)改變。
訊息的激發主要是由Subject的notify函式激發,至於什麼時候呼叫notify函式,可以自由設定(1、自動激發,2、客戶維護激發時機)
- #include <QtCore/QCoreApplication>
- #include <QList>
- class Subject;
- class Observer
- {
- public:
- virtual ~Observer();
- virtual void Update(Subject* theChangedSubject) = 0;
- protected:
- Observer(); /// >防止例項化
- };
- class Subject
- {
- public:
- virtual ~Subject();
- virtual void Attach(Observer * o){ m_observers.append(o);}
- virtual void Detach(Observer * o){ m_observers.removeOne(o);}
- virtual void Notify()
- {
- for(int i=0; i<m_observers.size(); ++i)
- {
- m_observers.at(i)->Update(this);
- }
- }
- protected:
- Subject(); /// >防止例項化
- private:
- QList<Observer*> m_observers;
- };
- class ClockTimer : public Subject
- {
- public:
- ClockTimer();
- void Tick(); /// 每tick一次激發一次notify
- };
- void ClockTimer::Tick()
- {
- Notify();
- }
- class DigitalClock : public QWidget , public Observer
- {
- public:
- DigitalClock(ClockTimer*);
- virtual ~DigitalClock();
- virtual void Update(Subject *theChangedSubject);
- virtual void Draw();
- private:
- ClockTimer * m_subject;
- };
- DigitalClock::DigitalClock(ClockTimer *s)
- {
- m_subject = s;
- m_subject->Attach(this);
- }
- DigitalClock::~DigitalClock()
- {
- m_subject->Detach(this);
- }
- void DigitalClock::Update(Subject *theChangedSubject)
- {
- if(m_subject == theChangedSubject)
- {
- Draw();
- }
- }
- void DigitalClock::Draw()
- {
- //// >繪製時間指標等內容
- }
- /// 類似的建立另一個clock為AnalogClock
- class AnalogClock
- {
- public:
- AnalogClock(ClockTimer*);
- virtual ~AnalogClock();
- virtual void Update(Subject *theChangedSubject);
- virtual void Draw();
- private:
- ClockTimer * m_subject;
- };
- ///..... AnalogClock 的實現
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- ClockTimer * timer = new ClockTimer;
- AnalogClock * aClock = new AnalogClock(timer);
- DigitalClock * dClock = new DigitalClock(timer);
- /// >則兩個時鐘總是顯示相同的時間,都通過timer來同事更新
- return a.exec();
- }
相關文章
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- 人人都會設計模式—觀察者模式–Observer設計模式Server
- Head First 設計模式(2)---觀察者(Observer)模式設計模式Server
- Java23種設計模式【22】----》觀察者模式(Observer)Java設計模式Server
- observer-觀察者模式Server模式
- Java設計模式——模板設計模式Java設計模式
- 設計模式(四)Singleton設計模式設計模式
- 設計模式----工廠設計模式設計模式
- 設計模式-工廠設計模式設計模式
- 【設計模式】代理模式設計模式
- 設計模式-代理模式設計模式
- 設計模式-策略模式設計模式
- 設計模式-模板模式設計模式
- 設計模式~代理模式設計模式
- 設計模式——模板模式設計模式
- 設計模式----代理模式設計模式
- 設計模式——策略模式設計模式
- 設計模式——代理模式設計模式
- 設計模式----中介模式設計模式
- 設計模式-中介模式設計模式
- 設計模式(策略模式)設計模式
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- 設計模式之單例設計模式設計模式單例
- 設計模式 #5 (策略模式、代理模式)設計模式
- 設計模式-單例模式、多例模式設計模式單例
- 【設計模式】設計模式(一)-- 大話設計模式讀書筆記設計模式筆記
- 設計模式之命令模式設計模式
- 設計模式 單例模式設計模式單例
- 設計模式之-命令模式設計模式
- Java設計模式-代理模式Java設計模式
- 設計模式 | 建造者模式設計模式
- 設計模式----工廠模式設計模式
- 設計模式之代理模式設計模式
- 設計模式🔫---策略模式設計模式
- 設計模式之【策略模式】設計模式
- 設計模式 - Bridge 橋模式設計模式
- 設計模式——單例模式設計模式單例
- 【設計模式】組合模式設計模式
- [設計模式] 單例模式設計模式單例