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