设计模式之观察者模式

// observer.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <list>
#include <iostream>
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;
    virtual void SetState(int) = 0;
};

class ConcreteObserver :public Observer {
public:
    ConcreteObserver(Subject* sub)
    {
        m_pSubject = sub;
    }
    virtual void Update(int val) {
        std::cout << "ob1 " << val << std::endl;
    }
private:
    Subject* m_pSubject;
};

class ConcreteObserver2 :public Observer {
public:
    ConcreteObserver2(Subject* sub)
    {
        m_pSubject = sub;
    }
    virtual void Update(int val) {
        std::cout << "ob2 " << val << std::endl;
    }
private:
    Subject* m_pSubject;
};

class ConcreteSubject :public Subject {
public:
    virtual void Attach(Observer* ob) {
        m_list.push_back(ob);
    }
    virtual void Detach(Observer* ob) {
        m_list.remove(ob);
    }
    virtual void notify() {
        for each (auto var in m_list)
        {
            var->Update(m_iState);
        }
    }

    void SetState(int state) {
        m_iState = state;
    }
private:
    std::list<Observer*> m_list;
    int m_iState;
};

int main()
{
    Subject* pSub = new ConcreteSubject();
    pSub->SetState(2);
    Observer* pObj1 = new ConcreteObserver(pSub);
    Observer* pObj2 = new ConcreteObserver2(pSub);
    pSub->Attach(pObj1);
    pSub->Attach(pObj2);
    pSub->notify();
    pSub->SetState(4);
    pSub->notify();
    pSub->Detach(pObj1);
    pSub->SetState(6);
    pSub->notify();
    system("pause");
    return 0;
}

 

posted @ 2021-06-21 22:41  njit-sam  阅读(53)  评论(0)    收藏  举报