一、问题描述 实验课上,老师因故暂时离开,A君与B君要游戏,但怕被抓,就委托门口的Spy同学盯梢。老师回来了,Spy分别通知A君和B君,关闭游戏,赶紧编程。 二、完成如下题目要求
一、问题描述
实验课上,老师因故暂时离开,A君与B君要游戏,但怕被抓,就委托门口的Spy同学盯梢。老师回来了,Spy分别通知A君和B君,关闭游戏,赶紧编程。
二、完成如下题目要求
(1)画出静态图
写出采用该设计模式的好处
2.观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知
编写代码
#include <iostream>#include <string>
#include <list>
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<Observer*> observers;
public:
string action;
virtual void attach(Observer*) = 0;
virtual void detach(Observer*) = 0;
virtual void notify() = 0;
};
//具体通知者,Spy
class Spy :public Subject
{
void attach(Observer *observer)
{
observers.push_back(observer);
}
void detach(Observer *observer)
{
list<Observer *>::iterator iter = observers.begin();
while (iter != observers.end())
{
if ((*iter) == observer)
{
observers.erase(iter);
}
++iter;
}
}
void notify()
{
list<Observer *>::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通知:老师离开"<<endl;
dwq->action = "打游戏";
dwq->notify();
cout << endl;
cout<<"Spy通知:老师来了"<<endl;
dwq->action = "老师来了!";
dwq->notify();
return 0;
}