一、问题描述
实验课上,老师因故暂时离开,A君与B君要游戏,但怕被抓,就委托门口的Spy同学盯梢。老师回来了,Spy分别通知A君和B君,关闭游戏,赶紧编程。
二、完成如下题目要求
(1)画出静态图
在这里插入图片描述
写出采用该设计模式的好处

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




Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐