大话设计模式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;
}
实现题设要求的内容。