大话设计模式9—观察者模式(通知者与观察者)

1.需求:老板回来,我不知道

假设同事1、同事2上班摸鱼炒股,为了防止老板发现,如果前台发觉老板回来迅速打电话告知两位同事。

2.双向耦合的设计

根据需求,可以设计两个类前台秘书类class Secretary和看股票同事类class StockObserver

2.1 前台秘书类

前台秘书类class Secretary的设计如下:有两个数据成员分别是存储着看股票同事类指针的数组,用于记录哪些同事需要前台帮忙观察老板是否回来;还需要一个字符串存储当前台发现老板回来打电话所说的内容。
那么前台秘书类的功能如下:①添加操作:添加需要帮忙的同事。②通知操作:通知数组中的同事。③设置和读取打电话的内容。

//Secretary.h
#ifndef SECRETARY_H
#define SECRETARY_H
#include<vector>
#include"StockObserver.h"
//前台秘书类
class Secretary {
   
private:
	vector<StockObserver*> m_observer;
	string m_action;
public:
	//Secretary();
	void Attach(StockObserver* observer);
	void Notify();
	void SetSecretaryAction(string action);
	string GetSecretaryAction();
};
#endif 

具体实现也比较简单,①添加操作:添加到vector。②通知操作:遍历数组,调用炒股同事的update方法(后续再提)。③设置和读取打电话的内容,也就是Set和Get m_action内容即可。

#include"Secretary.h"
#include"StockObserver.h"

//Secretary::Secretary() {
   
//	m_action = "老板没在";
//}

void Secretary::Attach(StockObserver* observer)
{
   
	m_observer.push_back(observer);
}

void Secretary::Notify()
{
   
	for (auto ob : m_observer)
	{
   
		ob->update();
	}
}
void Secretary::SetSecretaryAction(string action)
{
   
	m_action = action;
}

string Secretary::GetSecretaryAction()
{
   
	return m_action;
}

2.2 看股票同事类

看股票同事类class StockObserver的设计思路如下,需要有看股票同事的名字、前台秘书指针。构造函数负责初始化姓名和绑定前台秘书,上节中的update方法用来表示收到前台通知时需要采取的行动。
注意下这两个类属于互相引用,需要前置声明class Secretary;并在.cpp中实现其方法。

//StockObserver.h
#ifndef STOCKOBSERVER_H
#define STOCKOBSERVER_H
#include<string>
#include<iostream>
#include"Secretary.h"
using namespace std;
class Secretary;

//看股票同事类
class StockObserver {
   
private:
	string m_name;
	Secretary *m_sub;
public:
	StockObserver(string name, Secretary *sub);
	void update();
};
#endif // !STOCKOBSERVER_H

具体实现如下:update方法通过前台秘书的指针获取到前台电话内容,并执行关掉股票行情,继续工作。

#include"Secretary.h"
#include"StockObserver.h"
StockObserver::StockObserver(string name, Secretary *sub) :m_name(name), m_sub(sub){
   
}
void StockObserver::update()
{
   
	cout << m_sub->GetSecretaryAction()<<" "<<m_name ;
	cout << "关掉股票行情,继续工作" << endl;
}

2.3main函数及输出

最后main函数实现如下,在秘书类的对象中添加需要帮忙的同事1和同事2。当老板回来时将老板已回信息传递通知出去。

#include"Secretary.h"
#include"StockObserver.h"

int main()
{
   
	Secretary* qiantai = new Secretary();
	StockObserver *tongshi1 = new StockObserver("同事1", qiantai);
	StockObserver *tongshi2 = new StockObserver("同事2", qiantai);
	
	qiantai->Attach(tongshi1);
	qiantai->Attach(tongshi2);
	qiantai->SetSecretaryAction("老板已回");
	qiantai->Notify();
	return 0;
}

实现题设要求的内容。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值