行为模式---观察者模式
概念
观察者模式是设计模式的行为模式,是定义一种阅读机制。它的核心思想是定义对象间的一对多的依赖关系,当有一个对象发生改变之后通知多个观察对象。
观察者模式通过将观察者和被观察者解耦,使得观察者可以动态地订阅或取消订阅被观察者的状态变化。当被观察者的状态发生变化时,它会通知所有注册的观察者。
适用场景
1、当一个对象的状态发生给变之后,其他对象也需要跟着改变,或者说实际对象是未知状态或需要动态变化的时候需要使用到此模式。
2、当应用中的一些对象必须观察其他对象时,可以使用此模式。
创建方式
1、创建一个发送者(主题)的对象接口,实现和一个数据结构,数据结构用于保观察者的引用。
2、创建一个观察者接口,需要声明一个通知函数。
3、创建实际的发送者类,实现通知函数(此函数需要通知所有的观察者),订阅者添加、移除函数等。具体的订阅者通过添加函数和移除函数进行管理。
4、创建实际的观察者类,需要实现继承观察者接口。并且实现通知更新的方法。
5、客户端必须生成所需要的全部订阅者,并在相应的发布者哪里完成添加动作。
类关系图
示例代码
#include "GuanChaZheMoShi.h"
int main()
{
std::cout << "欢迎东哥来到设计模式的世界!\n";
//创建观察者对象
ObserverBase* observer = new Observer("观察者1");
ObserverBase* observer1 = new Observer("观察者2");
ObserverBase* observer2 = new Observer("观察者3");
ObserverBase* observer3 = new Observer("观察者4");
//将观察者添加到发送者对象中
Sender* sender = new Sender();
sender->addObserver(observer);
sender->addObserver(observer1);
sender->addObserver(observer2);
sender->addObserver(observer3);
sender->notifyCmd("帝王令:众将集合");
//删除观察者2 和观察者3
sender->delObserver(observer1);
sender->delObserver(observer2);
sender->notifyCmd("帝王令密令:造反")
}
#pragma once
#include "string"
#include "iostream"
#include "vector"
using namespace std;
//观察者接口类
class ObserverBase
{
public:
ObserverBase() {}
~ObserverBase() {}
virtual void notify(string notify) {}
};
//具体观察者接口类
class Observer : public ObserverBase {
public:
Observer(string name) {
m_name = name;
}
~Observer() {}
void notify(string notify) {
cout << m_name << ":" << notify << endl;
}
string getName() { return m_name; }
private:
string m_name;
};
//发送者接口类
class SenderBace {
public:
SenderBace() {}
~SenderBace() {}
virtual void addObserver(ObserverBase* observer) {}
virtual void delObserver(string name) {}
virtual void notifyCmd(string cmd) {}
};
//具体发送者
class Sender : public SenderBace {
public:
Sender() {}
~Sender() {}
void addObserver(ObserverBase* observer) {
m_vObserver.push_back(observer);
}
void delObserver(ObserverBase* observer) {
m_vObserver.erase(
std::remove(m_vObserver.begin(), m_vObserver.end(), observer),
m_vObserver.end()
);
}
void notifyCmd(string cmd) {
for (int i = 0; i < m_vObserver.size(); ++i) {
m_vObserver[i]->notify(cmd);
}
}
private:
vector<ObserverBase*> m_vObserver;
};
欢迎东哥来到设计模式的世界!
观察者1:帝王令:众将集合
观察者2:帝王令:众将集合
观察者3:帝王令:众将集合
观察者4:帝王令:众将集合
观察者1:帝王令密令:造反
观察者4:帝王令密令:造反