設計模式—-Observer模式

來源:互聯網
上載者:User

 

在以下任一情況下可以使用觀察者模式:

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為AnalogClockclass 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();}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.