[行为型模式] 观察者模式的理解





头文件
//ObserverPattern.h

#ifndef OBSERVER_PATTERN_H
#define OBSERVER_PATTERN_H

#include <Windows.h>
#include <iostream>
#include <list>
using namespace std;

namespace ObserverPattern
{
    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);
        void Detach(Observer *pObserver);
        void Notify();

        void SetState(int state)
        {
            m_iState = state;
        }

    private:
        std::list<Observer *> m_ObserverList;
        int m_iState;
    };

    //////////////////////////////////////////////////////////////////////////
    void ObserverPattern_Test();
}

#endif


实现
#include "ObserverPattern.h"

namespace ObserverPattern
{
    void ConcreteSubject::Attach(Observer *pObserver)
    {
        m_ObserverList.push_back(pObserver);
    }

    void ConcreteSubject::Detach(Observer *pObserver)
    {
        m_ObserverList.remove(pObserver);
    }

    void ConcreteSubject::Notify()
    {
        std::list<Observer *>::iterator it = m_ObserverList.begin();
        while (it != m_ObserverList.end())
        {
            (*it)->Update(m_iState);
            ++it;
        }
    }

    //////////////////////////////////////////////////////////////////////////
    void ObserverPattern_Test()
    {
        // Create Subject
        ConcreteSubject *pSubject = new ConcreteSubject();

        // Create Observer
        Observer *pObserver = new ConcreteObserver(pSubject);
        Observer *pObserver2 = new ConcreteObserver2(pSubject);

        // Change the state
        pSubject->SetState(2);

        // Register the observer
        pSubject->Attach(pObserver);
        pSubject->Attach(pObserver2);

        pSubject->Notify();

        // Unregister the observer
        pSubject->Detach(pObserver);

        pSubject->SetState(3);
        pSubject->Notify();

        delete pObserver;
        delete pObserver2;
        delete pSubject;
    }
}


客户端
#include "ObserverPattern.h"
using namespace ObserverPattern;

void main()
{
    ObserverPattern_Test();
}


运行结果

猜你喜欢

转载自jacky-dai.iteye.com/blog/2309028