当前位置: 首页 > article >正文

行为模式---观察者模式

概念

观察者模式是设计模式的行为模式,是定义一种阅读机制。它的核心思想是定义对象间的一对多的依赖关系,当有一个对象发生改变之后通知多个观察对象。

观察者模式通过将观察者和被观察者解耦,使得观察者可以动态地订阅或取消订阅被观察者的状态变化。当被观察者的状态发生变化时,它会通知所有注册的观察者。

适用场景

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:帝王令密令:造反

http://www.kler.cn/a/579645.html

相关文章:

  • 生物信息学与计算生物学:各自概念、主要内容、区别与联系、发展展望?
  • Gazebo不报错但是没有机器人模型
  • MySQL配置文件my.cnf和mysql.cnf、mysqld.cnf的区别
  • AI智能体崛起,“智能经济”加速跑,GAI认证助力未来
  • CCF-CSP第36次认证第四题——跳房子【优化思路:预处理区间最大值】
  • 小智智能体语言大模型硬件软件开发
  • 深度解析前端页面性能优化
  • Python零基础学习第三天:函数与数据结构
  • 面试之《vue常见考题》
  • Python的for循环和while
  • vscode带参数调试
  • IU5380C同步降压型2~4节多类型锂电池充电管理IC
  • 题解:CF633D Fibonacci-ish
  • Linux 进程管理 -- 进程的替换 (补进程创建)
  • MySQL环境安装详细教程(Windows/macOS/Linux)
  • 聚焦两会:科技与发展并进,赛逸展2025成创新新舞台
  • CI/CD—Jenkins cron定时任务表达式
  • 【微知】qemu如何配置ctrl+c不退出qemu系统?(-chardev stdio,id=char0,signal=off)
  • Go泛型学习笔记
  • C++二叉搜索树代码