【设计模式】观察者模式

来源:互联网 发布:js断点调试debugger 编辑:程序博客网 时间:2024/05/22 17:48
/*http://www.cnblogs.com/suzhou/p/dp16obsvr.html* 观察者模式* 情景:高数课,ABCD四位同学,A是好学生,去上课,B在寝室睡觉,C在网吧打游戏,D在学校外陪女友逛街* 他们约定,如果要点名了,A在QQ群里吼一声,他们立刻赶到教室去。* 采用观察者模式实现这个情景的应用。*/#include <iostream>#include <string>#include <list>using namespace std;//Observer:观察者,为那些在目标发生改变时需获得通知的对象定义一个更新接口class Observer {public:virtual ~Observer() {};virtual void Update(const string &msg) = 0;virtual string getName() = 0;protected:Observer(){};};//Subject:目标,知道它的观察者,提供注册和删除、通知观察者对象的接口class Subject{public:virtual ~Subject() {};virtual void registerObsvr(Observer* obsvr) = 0;virtual void removeObsvr(Observer* obsvr) = 0;virtual void notifyObsvrs(const string &msg) = 0;};//ConcreteSubject:具体目标,存储对象状态,状态改变时,向各个观察者发出通知class QQGroup : public Subject {public:QQGroup() { _observers = new list<Observer*>(); }void registerObsvr(Observer* obsvr);void removeObsvr(Observer* obsvr);void notifyObsvrs(const string &msg);private:list<Observer*> *_observers;};void QQGroup::registerObsvr(Observer* obsvr) {_observers->push_back(obsvr);}void QQGroup::removeObsvr(Observer* obsvr) {if (_observers->size() > 0)_observers->remove(obsvr);}void QQGroup::notifyObsvrs(const string &msg) {cout << "群消息:" << msg << endl;list<Observer*>::iterator iter = _observers->begin();for (; iter != _observers->end(); iter++) {(*iter)->Update(msg);}}//ConcreteObserver:具体观察者,维护一个指向ConcreteSubject对象的引用,存储有关状态,实现更新接口update,使自身状态与目标的状态保持一致class RoomMate : public Observer {public:RoomMate(string name, string now, string action){_name = name;_action = action;_now = now;};void Update(const string &msg);string getName();private:string _name;string _action;string _now;};string RoomMate::getName() {return _name;}void RoomMate::Update(const string &msg) {cout << "This is " << _name << endl;if (msg == "点名了")cout << "Action: " << _action << endl << endl;elsecout << "Go on:" << _now << endl << endl;}//测试代码int main(){RoomMate* B = new RoomMate("B","sleeping","get dressed and run to classroom");RoomMate* C = new RoomMate("C","playing games","pay the fee and run to classroom");RoomMate* D = new RoomMate("D","shopping with girl friend","go back to school and be worried about girl friend's angry");QQGroup* qqgroup = new QQGroup();qqgroup->registerObsvr(B);qqgroup->registerObsvr(C);qqgroup->registerObsvr(D);qqgroup->notifyObsvrs("目前没点名");qqgroup->notifyObsvrs("点名了");system("Pause");return 0;}

0 0