[设计模式]观察者模式(Observer)

【愚公系列】二十三种设计模式(十九)-观察者模式(Observer Pattern) 设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。 阅读详情

1.意图

       定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2.动机

       将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使得各类紧密耦合,因为这样降低了它们的可重用性。

       举个例子,一个表格对象和一个柱状图对象还有一个饼图对象,可以描述同一个数据对象,所以当数据对象改变的时候,以上这三个对象也应当同时更新。

3.结构与参与者


4.效果

       观察者模式允许你独立地改变目标和观察者。你可以单独复用目标对象而无需同时复用其观察者,反之亦然。它也使你可以在不改动目标和其他的观察者的前提下增加观察者。

1)目标和观察者之间的抽象耦合

       因为目标和观察者不是紧密耦合的,它们可以属于一个系统中的不同抽象层次。

2)支持广播通信

3)意外的更新(缺)

       因为一个观察者并不知道其他观察者的存在,它可能对改变目标的最终代价一无所知。在目标上一个看似无害的操作可能会引起一系列对观察者以及依赖于这些观察者的那些对象的更新。此外,如果依赖准则的定义或维护不当,常常会引起错误的更新,这种错误通常很难捕捉。

       简单的更新协议不提供具体细节说明目标中什么被改变了,这就使得上述问题更加严重。

5.实现

6.代码示例


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

class SecretaryBase;
//抽象观察者
class CObserverBase
{
protected:
	string name;
	SecretaryBase* sub;
public:
	CObserverBase(string strname,SecretaryBase* strsub)
	{
		name=strname;
		sub=strsub;
	}
	virtual void Update()=0;
};
//具体的观察者,看股票的
class StockObserver : public CObserverBase
{
public:
	StockObserver(string strname,SecretaryBase* strsub) : CObserverBase(strname,strsub)
	{
	}
	virtual void Update();
};

//具体观察者,看NBA的
class NBAObserver : public CObserverBase
{
public:
	NBAObserver(string strname,SecretaryBase* strsub) : CObserverBase(strname,strsub){}
	virtual void Update();
};


//抽象通知者
class SecretaryBase
{
public:
	string action;
	vector<CObserverBase*> observers;
public:
	virtual void Attach(CObserverBase* observer)=0;
	virtual void Notify()=0;
};

//具体通知者
class Secretary :public SecretaryBase
{
public:
	void Attach(CObserverBase* ob)
	{
		observers.push_back(ob);
	}
	void Notify()
	{
        vector<CObserverBase*>::iterator p = observers.begin();
		while (p!=observers.end())
		{
			(*p)->Update();
			p++;
		}
	}
};

void StockObserver::Update()
{
	cout<<name<<":"<<sub->action<<",不要玩股票了,要开始工作了"<<endl;
}
void NBAObserver::Update()
{
	cout<<name<<":"<<sub->action<<",不要看NBA了,老板来了"<<endl;
}


客户端:
int main()
{
    SecretaryBase *p=new Secretary();  //创建观察者
	
	//被观察的对象
	CObserverBase *s1= new NBAObserver("小李",p);
	CObserverBase *s2 = new StockObserver("小赵",p);
    //加入观察队列
	p->Attach(s1);
	p->Attach(s2);
    //事件
	p->action="老板来了";
	//通知
	p->Notify();

	return 0;
}


基于Yolo11的无人机小目标检测系统的设计与性能优化改进项目实现 该项目旨在开发一个基于YOLO11的无人机目标检测系统,能够实时识别并定位无人机拍摄过程中捕捉的小目标。考虑到无人机拍摄的目标通常较小,系统将采用特定的调优策略,以提高小目标的检测精度和召回率。 阅读详情

相关推荐

别再手动上传了!用宝塔面板的‘Let‘s Encrypt’免费SSL证书,3分钟自动续期

本文详细介绍了如何利用宝塔面板的‘Let‘s Encrypt’功能实现SSL证书的自动申请和续期,3分钟完成配置即可永久免费使用。通过对比不同SSL证书方案,突出Let's Encrypt的免费、自动续期和高安全性优势,特别适合个人博客和中小企业官网。

weixin_30415113的博客 150

设计模式之观察者模式(Observer Pattern)

观察者模式定义 Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义对象之间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到...

程铭程铭你快成名的博客 3589

SAP特殊采购类80实战:跨工厂生产配置避坑指南(附完整测试流程)

本文深入解析SAP特殊采购类80在跨工厂生产场景下的实战应用与配置要点。文章从核心业务逻辑出发,详细拆解了后台配置、主数据与BOM的“双工厂”思维模式,并提供了从创建需求到成品收货的完整测试流程。重点揭示了多层BOM下的需求传递陷阱及常见报错解决方案,旨在帮助SAP顾问及用户规避实施风险,实现资源的灵活调度与流程自动化。

wind6的博客 1139

Java - 【设计模式】观察者模式(Observer Pattern)

设计模式 - 观察者模式(Observer Pattern) -> 解决问题:一个对象的状态发生改变,如何通知其他对象? 被观察对象(Subject) 观察对象(Observer) -> 注意: 互相指定,互相包含! 一:被观察对象(Subject) 1> 维护一个可变对象,该对象变化对应一个方法,该方法内部需要通知所有观察者(notifyAllObservers) private int state; public void setState(int state) {

⚡ 578

VS2103+Intel2013+MSMPI运行Fortran并行程序

VS2103+Intel2013+MSMPI运行Fortran并行程序MSMPI安装新建Fortran90项目编写Fortran并行程序在cmd运行编译完成的执行文件 MSMPI安装 我这里采用的是Microsoft MPI v9.0.1,可以点此下载。下载完成后同时安装msmpisdk.msi、msmpisetup.exe两个文件,安装位置默认即可。 其中msmpisdk.msi的默认安装路径在C:\Program Files (x86)\Microsoft SDKs\MPI,该文件包含了mpi环境所需

weixin_43176703的博客 2936

设计模式-17观察者模式Observer Pattern

观察者模式是一种行为型设计模式,用于在对象间建立一对多的依赖关系。当主题对象状态改变时,所有依赖的观察者对象会自动收到通知并更新。该模式适用于事件处理、发布-订阅机制等场景,能实现松耦合的系统架构。典型结构包括Subject接口(定义添加/删除观察者方法)、Observer接口(定义更新方法)以及具体实现类。实现时,主题对象维护观察者列表,状态变化时遍历列表通知所有观察者。这种模式广泛应用于GUI事件处理、消息推送系统等需要实时数据更新的场景。

d3y1`5 81_09 956

气体放电管GDT选型解析

气体放电管(GDT)是电子设备电磁兼容设计中应对浪涌防护的核心器件,具有高能量吸收能力(10kA以上)和低漏电流特性。其工作原理分为击穿、导通和熄弧三阶段,通过电离气体泄放浪涌能量。GDT适用于雷击等大能量防护,但响应较慢(0.1-0.3μs),需搭配TVS/MOV组成多级防护。选型需匹配击穿电压(如220VAC系统选800V型号),并注意续流风险。典型应用包括电源端口、通信防雷模块的三极管共模防护或GDT-MOV串联方案,实现能量分流与快速钳位平衡。

硬核科技 208

设计模式之观察者模式(Observer Design Pattern)

观察者模式也被称为发布订阅模式,或者叫监听器模式大家更不觉得陌生,是11种行为型模式之一。 观察者模式在平时运用的较多叫法也不一,常见的有观察者(Observer)、监听器(Listener)、订阅者(Subscriber)、消费者(Consumer)等,有观察者就会有被观察者,与观察者对应依次为主题(Subject)、分发器(Dispatcher),发布者(Publisher)、生产商(Producer)。 在 GoF 的《设计模式》一书中,它的定义是这样的:Define a one-to-many

xjj1314的专栏 630

SLAM 轨迹评估工具——EVO安装、使用介绍

evo是一款用于视觉里程计和SLAM问题的轨迹评估工具. 核心功能是能够绘制相机的轨迹, 或评估轨迹与真值之间的误差. 支持多种数据集的轨迹格式(TUM、KITTI、EuRoC MAV、ROS的bag), 同时支持这些数据格式之间的相互转换,本文轨迹展示以tum数据格式为例。

u010196944的博客 1万+

luks-磁盘加密工具

linux磁盘加密配置工具及步骤详解

zdd56789的博客 120

Design Pattern - Observer Pattern (设计模式 - 观察者模式)

什么是Observer Pattern?在一个系统中,有一个对象接收数据,其他若干对象监听来自这个对象数据的变化的这种情况可以使用design pattern,接受数据的这个对象我们称为 发送者 publisher; 监听变化的对象我么称为 观察者 observer。稍微具体的例子有一个天气的基站会接受来自三个不同感应器的数据,每当 weather 数据被改变时,weather obj就会更新 d...

YtdxYHZ的专栏 616

MIKE21 MIKE软件 教程 0.1 软件介绍与教学目录

MIKE 21是一个专业的工程软件包,用于模拟河流、湖泊、河口、海湾、海岸及海洋的水流、波浪、泥沙及环境问题。在MIKE Zero集成平台中,主要有MIKE11,MIKE21,MIKE3三类软件,分别对应一维,二维,三维的水动力模型模拟。同时还包括MIKE HYDRO,MIKE FLOOD等其他功能,各软件的具体介绍请参考DHI公司的官方文档,在此不作赘述。学习过程中,对于任何操作界面的疑问,建议大家仔细阅读帮助文档(在有疑问的界面按F1调出),同时官方也提供了对应的线上和线下教学服务(免费+收费)。

Hello Word 2万+

设计模式之观察者模式 (Observer Design Pattern)

一、什么是观察者模式观察者定义了一种一对多的依赖关系,当一个主题(Subject)对象状态发生变化时,所有依赖它的相关对象都会得到通知并且能够自动更新自己的状态,这些依赖的对象称之为观察者(Observer)对象这类似于发布/订阅模式。观察者模式中的主题对象,会维持着一个依赖它的观察者对象列表,当主题对象状态发生改变时,主题对象便会调用这个列表中所有观察者对象的方法。观察者模式一般用在分布式时间处理

Heaven Wang 的专栏 2709

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java常用设计模式--观察者模式(Observer Pattern)

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 四个角色 Subject:抽象被观察者,把所有观察者对象的引用保存到集合中,然后 提供添加,移除,和通知观察者对象更新的方法。 ConcreteSubject:被观察者,集合存放观察者,重写增删和通知观察者 的方法,当发生变化时通知观...

gang_luo的博客 398

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

设计模式之 观察者模式 the observer design pattern

观察者模式适用于当某个对象的状态发生改变的时候,其他关联的对象也随之改变。想象一下rss订阅,当你订阅的rss有更新时,你就会收到新的内容。 本文参考了head first design pattern这本书。模拟气象站。 业务需求:现在手上有三个不同的产品。一个实时播报的气象显示器,一个基于预测的气象显示器,一个基于统计学的气象显示器。气象数据都来源于气象站,如果气象站数据更新,这三个不同的

萌萌的It人 www.itmmd.com 1023

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java设计模式 Design Pattern:观察者模式 Observer Pattern

意图 Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. 定义对象间的一种一对多的关系,从而使得当对象发生变化时,所有依赖他的对象都得到通知并且自动更新结构  Subject : knows its observers. Any number of Observer ob

OYJJ的专栏 1515

【设计模式】——观察者模式(Observer Pattern)

观察者模式(Observer Pattern)是其中一种非常流行的设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。本文将详细介绍观察者模式的概念、结构及其在C++中的实现。

J^T的博客 2386

设计模式-观察者模式-Observer Pattern

观察者模式的优点包括实现了观察者和被观察者之间的解耦,增加了程序的可扩展性,并且可以动态地添加或移除观察者。:观察者模式能够将被观察者(Subject)和观察者(Observer)解耦,使得被观察者的改变不会直接影响到观察者,两者之间的依赖关系降低。:在需要实现通知和消息传递的系统中,观察者模式可以用来通知用户或系统组件关于状态变化的信息,如电子邮件客户端中的新邮件通知。:在观察者模式中,如果一个观察者在更新时发生错误,可能会影响到其他观察者的更新,这需要在设计时考虑错误处理机制。

wesigj的博客 1482

设计模式-观察者模式(Observer Pattern)

本文结合代码详细地介绍了观察者模式的概念,适用场景,优缺点、实现方式,可以帮助读者更好地理解观察者模式

YUMIAloogy的博客~ 1268

23种设计模式之观察者模式(Observer Pattern)

观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主体对象,这个主题对象在状态发生变化时,会通知所有观察者。当一个对象改变需要同时改变其他对象,而且他不知道具体有多少对象需要改变的时候,应该考虑使用观察者模式。 观察者模式有四个角色:抽象主题、具体主题、抽象观察者、具体观察者。 ISubject接口(抽象目标):把所有观察者对象...

adrhy82246的专栏 285

C++设计模式——观察者模式(observer pattern)

一、原理讲解 1.1意图 定义一种“一对多”的关系。当一个对象(被观察者/发布者)的状态发生改变时,所有依赖它的对象都将得到通知并更新。又有别名为发布-订阅(publish-subscribe)。 1.2应用场景 一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中,以使它们可以独立的改变和复用 当一个对象改变,连带其它对象也跟着改变,但是不需要知道具体改变对象...

净无邪博客 1141

设计模式——观察者模式 (Observer Design Pattern)

一、什么是观察者模式 观察者定义了一种一对多的依赖关系,当一个主题(Subject)对象状态发生变化时,所有依赖它的相关对象都会得到通知并且能够自动更新自己的状态,这些依赖的对象称之为观察者(Observer)对象这类似于发布/订阅模式。 观察者模式中的主题对象,会维持着一个依赖它的观察者对象列表,当主题对象状态发生改变时,主题对象便会调用这个列表中所有观察者对象的方法。 观察者模式一般用在...

star_yang的博客 466

C++设计模式之观察者模式(Observer pattern)

观察者模式: 为对象建立一种“通知依赖”关系,当一个对象(目标对象)的状态发生变化时,所有的依赖对象(观察者对象)都得到通知并自动更新。 观察者模式,又称发布-订阅模式,其所作的工作就是在解除耦合,弱化依赖关系,采用面向对象技术,让耦合的双方都依赖于抽象,而不是依赖于具体,将这二者封装在独立的对象中以使它们可以独立的改变和复用。 观察者模式中的四类角色: 1.Subject(目标):抽象的目标类,提供增加和删除观察者对象的的方法,以及一个抽象的Notify方法(通知机制),目标类可以是接口,也可以是抽象类和

weixin_43086349的博客 266

详解Java设计模式之观察者模式(Observer Pattern)

观察者模式又叫做发布-订阅(Publish/Subscribe)模式,模型-视图( Model/View)模式、源-监听器( Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

Elegance never goes out of fashion 3627

浅谈设计模式——观察者模式(Observer Pattern)

文章目录前言观察者模式(Observer Pattern)UNL图场景示例总结 前言 本篇文章介绍了行为型模式——Observer Pattern。 有关设计模式的概述可以翻翻我之前的浅谈设计模式及Singleton 观察者模式(Observer Pattern) 观察者模式也称为依赖模式和发布-订阅模式 即定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,所有依赖于它的对象都会得到通知并自动更新。 UNL图 #mermaid-svg-1QRVkSNmmj5uw5hR .label{font-fa

qq_44438746的博客 407
上一篇: [设计模式]状态模式 (State)
下一篇: [设计模式]备忘录模式(Memento)
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值