观察者模式

网友投稿 934 2022-10-31

观察者模式

观察者模式

一、问题描述

实验课上,老师因故暂时离开,A君与B君要游戏,但怕被抓,就委托门口的Spy同学盯梢。老师回来了,Spy分别通知A君和B君,关闭游戏,赶紧编程。

二、完成如下题目要求

(1)画出静态图

写出采用该设计模式的好处

1.观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口2.观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知

编写代码

#include #include #include using namespace std;class Subject;//抽象观察者class Observer{ protected: string name; Subject *sub; public: Observer(string name, Subject *sub) { this->name = name; this->sub = sub; } virtual void update() = 0;};//具体的观察者,A君玩游戏 class GamePlayerA :public Observer{ public: GamePlayerA(string name, Subject *sub) :Observer(name, sub) { } void update();};//具体的观察者,B君玩游戏 class GamePlayerB :public Observer{ public: GamePlayerB(string name, Subject *sub) :Observer(name, sub) { } void update();};//抽象通知者class Subject{ protected: list observers; public: string action; virtual void attach(Observer*) = 0; virtual void detach(Observer*) = 0; virtual void notify() = 0;};//具体通知者,Spyclass Spy :public Subject{ void attach(Observer *observer) { observers.push_back(observer); } void detach(Observer *observer) { list::iterator iter = observers.begin(); while (iter != observers.end()) { if ((*iter) == observer) { observers.erase(iter); } ++iter; } } void notify() { list::iterator iter = observers.begin(); while (iter != observers.end()) { (*iter)->update(); ++iter; } }};void GamePlayerA::update(){ cout << name << " 收到消息:" << sub->action << endl; if (sub->action == "老师来了!") { cout << "A君关闭游戏,赶紧编程" << endl; }}void GamePlayerB::update(){ cout << name << " 收到消息:" << sub->action << endl; if (sub->action == "老师来了!") { cout << "B君关闭游戏,赶紧编程" << endl; }}int main(){ Subject *dwq = new Spy(); //创建观察者 //被观察的对象 Observer *a = new GamePlayerA("A君", dwq); Observer *b = new GamePlayerB("B君", dwq); //加入观察队列 dwq->attach(a); dwq->attach(b); //事件 cout<<"Spy通知:老师离开"<action = "打游戏"; dwq->notify(); cout << endl; cout<<"Spy通知:老师来了"<action = "老师来了!"; dwq->notify(); return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈@Aspect@Order各个通知的执行顺序
下一篇:外观模式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~