1. 程式人生 > >C++學習經歷(十五)觀察者模式

C++學習經歷(十五)觀察者模式

觀察者模式

 觀察者模式定義了一種一隊多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態上發生變化時,會通知所有觀察者物件,使他們能夠自動更新自己。


#include <iostream>
#include <list>

using namespace std;

class Observer;

//通知者
class Subject
{
    public:
        virtual void add(Observer *o) = 0;
        virtual void remove(Observer *o) = 0;
        virtual void notify(string str) = 0;
};

//觀察者
class Observer
{
    public:
        virtual void subscribe(Subject *s) = 0;
        virtual void unSubscribe(Subject *s) = 0;
        virtual void update(string str) = 0;
};

class Secretray : public Subject
{
    private:
        list<Observer *> *l;
    public:
        Secretray()
        {
            l = new list<Observer *>;
        }
        void add(Observer *o)
        {
            l -> push_back(o);
        }
        void remove(Observer *o)
        {
            l -> remove(o);
        }
        void notify(string str)
        {
            for(list<Observer *>::iterator it = l -> begin();it != l -> end();it++)
            {
                (*it) -> update(str);
            }
        }
};

class PlayGame : public Observer
{
    public:
        void subscribe(Subject *s)
        {
            s -> add(this);
        }
        void unSubscribe(Subject *s)
        {
            s -> remove(this);
        }
        void update(string str)
        {
            if(str == "Boss Coming")
            {
                cout << "Boss Coming,Start Working" << endl;
            }
            else if(str == "Boss Leaving")
            {
                cout << "Boss Leaving,continue to paly" << endl;
            }
        }
};

class WatchNBA : public Observer
{
    public:
        void subscribe(Subject *s)
        {
            s -> add(this);
        }
        void unSubscribe(Subject *s)
        {
            s -> remove(this);
        }
        void update(string str)
        {
            if(str == "Boss Coming")
            {
                cout << "Boss Coming,Start Working" << endl;
            }
            else if(str == "Boss Leaving")
            {
                cout << "Boss Leaving,continue to paly" << endl;
            }
        }
};

int main(int argc, char **argv)
{
    Subject *s = new Secretray;
    Observer *o1 = new PlayGame;
    Observer *o2 = new WatchNBA;

    o1 -> subscribe(s);
    o2 -> subscribe(s);

    s -> notify("Boss Coming");

    o1 -> unSubscribe(s);

    s -> notify("Boss Leaving");


    return 0;
}