观察者模式
观察者模式定义了一种一队多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
#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;
}