当前位置 : 主页 > 编程语言 > java >

观察者模式

来源:互联网 收集:自由互联 发布时间:2022-07-13
一、问题描述 实验课上,老师因故暂时离开,A君与B君要游戏,但怕被抓,就委托门口的Spy同学盯梢。老师回来了,Spy分别通知A君和B君,关闭游戏,赶紧编程。 二、完成如下题目要求


一、问题描述

实验课上,老师因故暂时离开,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;
}


上一篇:首个步态识别框架开源了
下一篇:没有了
网友评论