設計模式——5.觀察者模式

來源:互聯網
上載者:User

標籤:iterator   turn   觀察者   設計   subject   ras   vat   contains   ram   

觀察者模式(Observer)簡介:

定義一個一對多的依賴關係,讓多個觀察者對象監聽某個主題對象,當主題對象的狀態發生改變時,主題對象則通知所有的觀察者對象,做出相應的反應,更新自己的狀態等。

觀察者模式(Observer)結構圖:

C++代碼:

Subject抽象類別:

        //file: Subject.h    #pragma once    #include "Observer.h"    #include <vector>    using namespace std;        class Subject    {    public:        Subject();        virtual ~Subject();        Observer *m_Observer;            void attach(Observer *pObserver);        void detach(Observer *pObserver);            void notify();            virtual int getState() = 0;        virtual void setState(int i) = 0;        private:        vector<Observer *> m_vtObj;    };
    //file: Subject.cpp    #include "pch.h"    #include "Subject.h"        Subject::Subject() {}        Subject::~Subject() {}        void Subject::attach(Observer *pObserver)    {        m_vtObj.push_back(pObserver);    }        void Subject::detach(Observer *pObserver)    {        for (vector<Observer *>::iterator iter = m_vtObj.begin(); iter != m_vtObj.end(); iter++)        {            if (*iter == pObserver)            {                m_vtObj.erase(iter);                return;            }        }    }        void Subject::notify()    {        for (vector<Observer *>::iterator iter = m_vtObj.begin(); iter != m_vtObj.end(); iter++)        {            (*iter)->update(this);        }    }

Observer抽象類別:

    //file: Observer.h    #pragma once    class Subject;        class Observer    {    public:        Observer();        virtual ~Observer();        virtual void update(Subject *ps) = 0;    };    
    //file: Observer.cpp    #include "pch.h"    #include "Observer.h"        Observer::Observer() {}        Observer::~Observer() {}

ConcreteSubject具體主題類:

    //file: ConcreteSubject.h    #pragma once    #include "Subject.h"        class ConcreteSubject : public Subject    {    public:        ConcreteSubject();        virtual ~ConcreteSubject();        virtual int getState();        virtual void setState(int i);        private:        int m_State;    };    
    //file: ConcreteSubject.cpp    #include "pch.h"    #include "ConcreteSubject.h"        ConcreteSubject::ConcreteSubject() {}        ConcreteSubject::~ConcreteSubject() {}        int ConcreteSubject::getState()    {        return m_State;    }        void ConcreteSubject::setState(int i)    {        m_State = i;    }

ConcreteObserver具體觀察者類:

    //file: ConcreteObserver.h    #pragma once    #include "Observer.h"    #include <string>    using namespace std;        class ConcreteObserver : public Observer    {    public:        ConcreteObserver(string pName);        virtual ~ConcreteObserver();        virtual void update(Subject *ps);        private:        string m_ObjName;        int m_ObserverState;    };
    //file: ConcreteObserver.cpp    #include "pch.h"    #include "ConcreteObserver.h"    #include "Subject.h"    #include <iostream>        ConcreteObserver::ConcreteObserver(string pName)    {        m_ObjName = pName;    }        ConcreteObserver::~ConcreteObserver() {}        void ConcreteObserver::update(Subject *ps)    {        m_ObserverState = ps->getState();        cout << "update observer " << m_ObjName << " to state "<<m_ObserverState<< " !" << endl;    }

用戶端代碼:

    //file: ObserverPattern.cpp : This file contains the 'main' function. Program execution begins and ends there.    #include "pch.h"    #include <iostream>    #include "ConcreteSubject.h"    #include "ConcreteObserver.h"        int main()    {        Subject *sub = new ConcreteSubject();        Observer *objA = new ConcreteObserver("A");        Observer *objB = new ConcreteObserver("B");            sub->attach(objA);        sub->attach(objB);            sub->setState(101);        sub->notify();            sub->detach(objB);            sub->setState(102);        sub->notify();            char c;        cin >> c;        delete sub;        delete objA;        delete objB;        return 0;    }

設計模式——5.觀察者模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.