在日常开发中,我们经常会遇到 “一个对象状态变化,多个对象需要同步响应” 的场景 —— 比如公众号发布文章后,所有订阅者都会收到推送;比如服务器启动后,日志、监控等组件需要同步初始化;比如监控系统检测到 CPU 阈值超标后,邮件、短信告警模块需要立即触发。

面对这类场景,硬编码的if-else会让代码耦合度极高、扩展性极差,而观察者模式正是解决这类问题的最优解之一。本文将从原理到实战,全面拆解观察者模式,结合 C++ 代码实现,让你真正掌握这一高频设计模式。

一、什么是观察者模式?

1. 核心定义

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象间的一对多依赖关系:当一个对象(被观察者 / 主题)的状态发生改变时,所有依赖它的对象(观察者)都会自动收到通知,并进行相应的更新操作。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

class observer//观察者
{
public:
	virtual void updata(const string& ober) = 0;//接收主题
	virtual ~observer() = default;
};

class realobserver :public observer
{
public:
	void updata(const string& msg)
	{
		cout << "消息更新:" << msg << endl;
	}
};

class subject//模式主题
{
private:
	//用vector存储所有的观察者
	vector<observer*> _observer;
public:
	virtual ~subject() = default;
	//添加观察者
	void attach(observer* observer)
	{
		_observer.push_back(observer);
	}
	//删除观察者
	void detach(observer* observer)
	{
		for (auto it=_observer.begin();it!=_observer.end();it++)
		{
			if (*it == observer)
			{
				_observer.erase(it);
				break;
			}
		}
	}
	//更新消息
	void notify(const string& msg)
	{
		//遍历容器,调用更新函数
		for (auto x : _observer)
		{
			x->updata(msg);
		}
	}

};

class msgsubbject :public subject
{
public:
	void sendmsg(const string& msg)
	{
		notify(msg);
	}

};



int main()
{
	msgsubbject subject;
	realobserver observer1;
	realobserver observer2;
	
	subject.attach(&observer1);
	subject.attach(&observer2);

	subject.sendmsg("大家好,欢迎大家");

	


}

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐