美文网首页
c++观察者模式

c++观察者模式

作者: 一路向后 | 来源:发表于2021-02-18 21:43 被阅读0次

    1.观察者模式简介

       观察者模式(Observer),又叫发布-订阅模式(Publish/Subscribe),定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

    2.源码实现

    #include <iostream>
    #include <string>
    #include <list>
    
    using namespace std;
    
    class Observer
    {
    public:
        virtual void Update(int) = 0;
    };
    
    class Subject
    {
    public:
        virtual void Attach(Observer *) = 0;
        virtual void Detach(Observer *) = 0;
        virtual void Notify() = 0;
    };
    
    class ConcreteObserver : public Observer
    {
    public:
        ConcreteObserver(Subject *pSubject) : m_pSubject(pSubject){};
    
        void Update(int value)
        {
            cout << "ConcreteObserver get the update New State: " << value << endl;
        }
    
    private:
        Subject *m_pSubject;
    };
    
    class ConcreteObserver2 : public Observer
    {
    public:
        ConcreteObserver2(Subject *pSubject) : m_pSubject(pSubject){};
    
        void Update(int value)
        {
            cout << "ConcreteObserver2 get the update New State: " << value << endl;
        }
    
    private:
        Subject *m_pSubject;
    };
    
    class ConcreteSubject : public Subject
    {
    public:
        void Attach(Observer *pObserver)
        {
            m_ObserverList.push_back(pObserver);
        }
    
        void Detach(Observer *pObserver)
        {
            m_ObserverList.remove(pObserver);
        }
    
        void Notify()
        {
            list<Observer *>::iterator it = m_ObserverList.begin();
    
            while(it != m_ObserverList.end())
            {
                (*it)->Update(m_iState);
                it++;
            };
        }
    
        void SetState(int state)
        {
            m_iState = state;
        }
    
    private:
        list<Observer *> m_ObserverList;
        int m_iState;
    };
    
    int main(int argc, char **argv)
    {
        ConcreteSubject *pSubject = new ConcreteSubject();
    
        Observer *pObserver = new ConcreteObserver(pSubject);
        Observer *pObserver2 = new ConcreteObserver2(pSubject);
    
        pSubject->SetState(2);
        pSubject->Attach(pObserver);
        pSubject->Attach(pObserver2);
    
        pSubject->Notify();
    
        pSubject->Detach(pObserver);
        pSubject->SetState(3);
        pSubject->Notify();
    
        delete pObserver;
        delete pObserver2;
        delete pSubject;
    
        return 0;
    }
    

    3.编译源码

    $ g++ -o example example.cpp
    

    4.运行及其结果

    $ ./example
    ConcreteObserver get the update New State: 2
    ConcreteObserver2 get the update New State: 2
    ConcreteObserver2 get the update New State: 3
    

    相关文章

      网友评论

          本文标题:c++观察者模式

          本文链接:https://www.haomeiwen.com/subject/dmonxltx.html