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;
}
 

猜你喜欢

转载自blog.csdn.net/Zhanganliu/article/details/82753399