设计模式:观察者模式(Observer)

观察者模式简介 创建一个具体主题类(ConcreteSubject),该类继承自主题类,在具体主题中定义了相应的业务逻辑,并在合适的时机通过调用触发事件方法来通知所有注册的观察者。最后,在使用示例中,我们创建了一个具体主题对象和两个具体观察者对象,并将观察者注册到主题上。创建具体的主题类(ConcreteSubject),该类维护了一个观察者列表,并在状态改变时遍历通知所有注册的观察者。最后,我们创建了具体的观察者类。主题和观察者都实现相应接口,在主题中维护一个观察者列表,并在状态改变时遍历通知所有观察者。 阅读详情

设计模式:观察者模式(Observer)

观察者模式(Observer Pattern)属于行为型模式(Behavioral Pattern)的一种。

行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。

行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。

通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作完成某些复杂功能,一个对象在运行时也将影响到其他对象的运行。

行为型模式分为类行为型模式和对象行为型模式两种:

  1. 类行为型模式:类的行为型模式使用继承关系在几个类之间分配行为,类行为型模式主要通过多态等方式来分配父类与子类的职责。
  2. 对象行为型模式:对象的行为型模式则使用对象的聚合关联关系来分配行为,对象行为型模式主要是通过对象关联等方式来分配两个或多个类的职责。根据“合成复用原则”,系统中要尽量使用关联关系来取代继承关系,因此大部分行为型设计模式都属于对象行为型设计模式。

模式动机

建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展,这就是观察者模式的模式动机。

模式定义

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。

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

模式结构

  1. 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法。
  2. 观察者(Observer):观察者是接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
  3. 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
  4. 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。

在这里插入图片描述

观察者模式通过将主题和观察者解耦,实现了对象之间的松耦合。当主题的状态发生改变时,所有依赖于它的观察者都会收到通知并进行相应的更新。

时序图

在这里插入图片描述

模式实现

被观察者基类 Subject.h:

#ifndef _SUBJECT_H_
#define _SUBJECT_H_

#include "Observer.h"
#include <list>
/**
 * 被观察者基类
 * 1. 观察者需要在这里注册、注销
 * 2. 当被观察者发生变化时,需要通知观察者
*/
class Subject
{
protected:
	std::list<Observer*> m_ObserverList;

public:
	Subject() {}
	virtual ~Subject() = default;
	
	virtual void attach(Observer*) = 0; // 向该目标绑定一个观察者
	virtual void detach(Observer*) = 0; // 将观察者从该目标上注销
	virtual void notify() = 0; // 目标自身发生变化时,通知所有的观察者
	virtual int getState() = 0; // 取得目标的值
	virtual void setState(int) = 0; // 修改目标的值
};

#endif // !_SUBJECT_H_

被观察者派生类 ConcreteSubject.h:

#ifndef _CONSRETE_SUBJECT_H_
#define _CONSRETE_SUBJECT_H_

#include "Observer.h"
#include "Subject.h"

class ConcreteSubject : public Subject
{
private:
	int state;

public:
	ConcreteSubject() {}
	virtual ~ConcreteSubject() {}

	void attach(Observer* pObserver)
	{
		m_ObserverList.push_back(pObserver);
	}
	void detach(Observer* pObserver)
	{
		m_ObserverList.remove(pObserver);
	}
	void notify()
	{
		std::list<Observer*>::iterator iter = m_ObserverList.begin();
		while (iter != m_ObserverList.end())
		{
			(*iter)->update(this);
			iter++;
		}
	}

	int getState()
	{
		return state;
	}

	void setState(int st)
	{
		state = st;
	}
};

#endif // !_CONSRETE_SUBJECT_H_

观察者基类 Observer.h:

#ifndef _OBSERVER_H_
#define _OBSERVER_H_

class Subject;
// 观察者基类
class Observer
{
public:
	Observer() {}
	virtual ~Observer() = default;

	virtual void update(Subject*) = 0; // 接收从目标传递过来的内容,并进行处理
};

#endif // !_OBSERVER_H_

观察者派生类 ConcreteObserver.h:

#ifndef _CONSRETE_OBSERVER_H_
#define _CONSRETE_OBSERVER_H_

#include "Observer.h"
#include "Subject.h"
#include <iostream>

class ConcreteObserver : public Observer
{
private:
	int observerState;

public:
	ConcreteObserver() {}
	virtual ~ConcreteObserver() {}

	void update(Subject* pSubject)
	{
		observerState = pSubject->getState();
		std::cout << "ConcreteObserver get the update New State: " << observerState << std::endl;
	}
};

#endif // !_CONSRETE_OBSERVER_H_

观察者模式在单线程环境下的测试

测试代码 main.cpp:

#include "ConcreteSubject.h"
#include "ConcreteObserver.h"
using namespace std;

int main()
{
	ConcreteSubject* pSubject = new ConcreteSubject();
	Observer* pObserver1 = new ConcreteObserver();
	Observer* pObserver2 = new ConcreteObserver();

	pSubject->attach(pObserver1);
	pSubject->attach(pObserver2);
	pSubject->setState(2);
	pSubject->notify();
	cout << "-------------------------" << endl;
	pSubject->detach(pObserver1);
	pSubject->setState(3);
	pSubject->notify();
	
	delete pObserver1;
	delete pObserver2;
	delete pSubject;

	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述

本程序创建了一个目标 pSubject,两个观察者 pObserver1 和 pObserver2,将这两个观察者注册在目标上。

设置目标的 state 为 2,然后使用 notify() 函数进行通知。可以看到,两个观察者都对目标的变化做出来响应;

目标注销 pObserver1,再次设置目标的 state 为 3,然后使用 notify() 函数进行通知。可以看到,现在只有一个观察者对目标的变化做出来响应。

观察者模式在多线程环境下的测试

测试代码 main.cpp:

#include "ConcreteSubject.h"
#include "ConcreteObserver.h"
#include <thread>
using namespace std;

ConcreteSubject* pSubject = new ConcreteSubject();
Observer* pObserver = new ConcreteObserver();

static void func1()
{
	pSubject->setState(1);
	pSubject->notify();
}

static void func2()
{
	pSubject->setState(2);
	pSubject->notify();
}

int main()
{
	pSubject->attach(pObserver);

	thread t1(func1);
	thread t2(func1);
	t1.join();
	t2.join();

	pSubject->detach(pObserver);
	
	delete pObserver;
	delete pSubject;

	system("pause");
	return 0;
}

运行结果:

在这里插入图片描述

之前的代码显然不能用于多线程,不能让多线程操作一个没有同步的数据结构。

多线程下的观察者模式

只需要修改被观察者的派生类的 attach、detach、notify 三个函数,加上互斥锁。

mutex类提供了能用于保护共享数据免受从多个线程同时访问的同步原语。

创建lock_guard对象时,它试图接收给定互斥的所有权。控制离开创建 lock_guard 对象的作用域时,销毁 lock_guard 并释放互斥。

修改后的 ConcreteSubject.h:

#ifndef _CONSRETE_SUBJECT_H_
#define _CONSRETE_SUBJECT_H_

#include "Observer.h"
#include "Subject.h"
#include <mutex>

class ConcreteSubject : public Subject
{
private:
	int state;
	std::mutex _mutex;

public:
	ConcreteSubject() {}
	virtual ~ConcreteSubject() {}

	void attach(Observer* pObserver)
	{
		std::lock_guard<std::mutex> guard(_mutex);
		m_ObserverList.push_back(pObserver);
	}
	void detach(Observer* pObserver)
	{
		std::lock_guard<std::mutex> guard(_mutex);
		m_ObserverList.remove(pObserver);
	}
	void notify()
	{
		std::lock_guard<std::mutex> guard(_mutex);
		std::list<Observer*>::iterator iter = m_ObserverList.begin();
		while (iter != m_ObserverList.end())
		{
			(*iter)->update(this);
			iter++;
		}
	}

	int getState()
	{
		return state;
	}

	void setState(int st)
	{
		state = st;
	}
};

#endif // !_CONSRETE_SUBJECT_H_

多线程下的测试代码不变,以下是测试结果:

在这里插入图片描述

模式分析

  • 观察者模式描述了如何建立对象与对象之间的依赖关系,如何构造满足这种需求的系统。
  • 这一模式中的关键对象是观察目标和观察者,一个目标可以有任意数目的与之相依赖的观察者,一旦目标的状态发生改变,所有的观察者都将得到通知。
  • 作为对这个通知的响应,每个观察者都将即时更新自己的状态,以与目标状态同步,这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅它并接收通

优缺点

优点:

  1. 观察者模式可以实现表示层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表示层作为具体观察者角色。
  2. 观察者模式在观察目标和观察者之间建立一个抽象的耦合。
  3. 观察者模式支持广播通信。
  4. 观察者模式符合“开闭原则”的要求。

缺点:

  1. 如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  2. 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  3. 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

适用场景

在以下情况下可以使用观察者模式:

  1. 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
  2. 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
  3. 一个对象必须通知其他对象,而并不知道这些对象是谁。
  4. 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

应用场景

观察者模式在软件开发中应用非常广泛,如某电子商务网站可以在执行发送操作后给用户多个发送商品打折信息,某团队战斗游戏中某队友牺牲将给所有成员提示等等,凡是涉及到一对一或者一对多的对象交互场景都可以使用观察者模式。

模式拓展:MVC 模式

MVC模式是一种架构模式,它包含三个角色:模型(Model),视图(View)和控制器(Controller)。观察者模式可以用来实现MVC模式,观察者模式中的观察目标就是MVC模式中的模型(Model),而观察者就是MVC中的视图(View),控制器(Controller)充当两者之间的中介者(Mediator)。当模型层的数据发生改变时,视图层将自动改变其显示内容。

参考

  1. https://design-patterns.readthedocs.io/zh-cn/latest/behavioral_patterns/observer.html
  2. https://blog.youkuaiyun.com/sinat_38816924/article/details/122760490
  3. https://www.jianshu.com/p/a14ccd51b97d
  4. https://www.runoob.com/design-pattern/observer-pattern.html
全网最全医学图像数据汇总 本仓库汇总了多个领域的医学图像开源数据集,涵盖CT、MRI、超声、内窥镜、病理、多模态、PET、OCT以及皮肤镜等多种成像技术。每个数据集均详细列出了任务类型、部位、格式、数量及下载链接,旨在为医学图像研究者提供便捷的资源导航。⚠️:这些数据集仅适用于学术研究用途。 阅读详情

相关推荐

RK3588内核崩溃日志捕获:pstore与ramoops的实战配置指南

本文详细介绍了在RK3588嵌入式设备上配置pstore与ramoops以捕获内核崩溃日志的实战指南。通过内核配置调整、设备树设置及高级调试技巧,帮助开发者有效定位系统崩溃原因,特别适合户外智能设备等无法长期连接调试器的场景。文章还提供了生产环境优化建议,确保日志捕获的可靠性与安全性。

weixin_29189363的博客 407

设计模式第5讲——观察者模式(Observer)

观察者模式属于行为型模式。一、什么是观察者模式 二、特点 三、组成 四、应用场景4.1 生活场景4.2 程序场景 五、观察者模式实现5.0 UML类图5.1 Newspaper5.2 NewspaperImpl5.3 Subscriber5.4 SubscriberImpl5.5 测试

让~学习~成为一种习惯(橡 皮 人の技术博客) 2万+

从零到一:基于K375S主控的机械键盘优联无线化改造实战

本文详细记录了基于罗技K375S主控进行机械键盘优联无线化改造的全过程。从改造动机、核心原理与物料准备,到电路设计、PCB打样、焊接调试,逐步拆解了将优联技术集成到自定义机械键盘中的实战步骤。项目最终实现了低延迟、高稳定性且支持多设备连接的优联无线机械键盘,为DIY爱好者提供了高性价比的改造方案。

h0i1j2k3l的博客 602

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

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式包含以下角色:主题(Subject):被观察的对象,维护一个观察者列表,提供添加、删除和通知观察者的方法。观察者(Observer):观察主题对象的状态变化,实现 Update 方法来更新自己的状态。

miaoyl的博客 7673

Python小白也能玩转迅投QMT量化交易?手把手教你从安装到第一个策略

本文为零基础Python用户提供了上手迅投QMT量化交易平台的完整指南。从Python 3.6环境配置、QMT客户端获取安装,到核心概念讲解,并手把手教你编写并回测一个经典的双均线交易策略,帮助初学者快速迈出量化交易的第一步。

weixin_29103191的博客 763

在mdk文件移植太多_XCubeClassB代码 的移植

前言ST在www.st.com官网上提供了针对IEC60730/IEC60335 ClassB认证的软件包。软件包分为三个,分别适用STM8,STM32(基于标准外设库)和STM32(基于HAL库):STM8-SafeCLASSB,STM32-CLASSB-SPL,X-CUBE-CLASSB。本文以X-CUBE-CLASSB为例介绍如何做代码的移植以及经常遇到的问题的解决办法。X-CUB...

weixin_28898707的博客 1834

设计模式之观察者模式详解

观察者模式 (Observer Pattern) 又叫发布-订阅模式 (Publish/Subscribe),定义一种一对多的依赖关系,一个主题对象 (被观察对象) 可被多个观察者对象同时监听,使得每当主题对象状态变化时,所有依赖于它的对象都会得到通知并被更新,属于行为型模式。 ​ 观察者模式的核心是将观察者与主题对象解耦,以类似于消息、广播发送的机制联动两者,使被观察者的变动能通知到感兴趣的观察者们,从而做出相应的响应

weixin_45538589的博客 6109

Anthropic发布10款金融AI智能体模板深度解析:重构华尔街工作范式

摘要:2026年5月,Anthropic发布10款金融AI智能体模板,标志着AI从辅助工具升级为"虚拟同事"。这些智能体深度集成到Word、Excel等办公软件中,覆盖投行、商行、资管三大场景的核心工作流,预计可提升效率35-85%。技术架构基于Claude3.5Sonnet模型,具备200K上下文窗口和95%+的财务图表解析准确率,并与彭博等金融数据源直连。发布引发传统金融数据服务商股价下跌,摩根大通等机构则视其为成本优化工具。落地需分四阶段推进,关键在于数据治理和复合型人才培养。未来

yyq916的博客 635

java设计模式-观察者模式

观察者模式介绍: 观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。 简单案例: 假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫,使用观察者模式描述该过程 抽象目标类 MySubject MySubject是抽象目标类,在其中定义了一个ArrayList类型的集合observers,用于存储观察者对象,并

张钰杰杰杰杰杰的博客 2234

YOLOv8独家原创改进:原创自研 | 自研独家创新DSAM注意力 ,基于BiLevelRoutingAttention注意力升级

提出新颖的注意力DSAM(Deformable Bi-level SpatialAttention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的Deformable Bi-level Attention+Spartial Attention

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1515

MySQL——cost成本计算之MySQL如何选择使用索引(trace)

文章目录前言trace工具分析执行计划 前言 在之前博客中,根据测试案例,发现同样的sql语句,因为传入的条件值的不同,导致MySQL有时候选择使用索引,有时候又不适用索引。 如下所示sql的执行计划: EXPLAIN SELECT * FROM employees WHERE name > 'aaa'; EXPLAIN SELECT * FROM employees WHERE name > 'zzzz'; 在MySQL中,为什么会出现上述这种玄乎的现象呢? 本篇博客重点说明原因。 在说

专注写bug 680

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

import java.util.ArrayList; import java.util.List; /** * 观察者模式。 * @author Bright Lee */ public class ObserverPattern { public static void main(String[] args) { Subject subject = new AnimalKe...

look4liming的专栏 311

YOLO+OpenClaw缺陷检测智能体 | 低代码工业质检自动化方案 | 含YOLO模型训练/智能体集成/任务全流程,支持离线日报/预警/趋势分析,解决实时性瓶颈问题(下篇)

某PCB板制造商需要对生产线上的PCB板进行缺陷检测,主要检测划痕、凹坑、污渍和裂纹等缺陷。原有人工检测方式效率仅为200件/小时,漏检率达5%,且检测人员长期工作易疲劳。

qq_36130719的博客 208

设计模式教程:观察者模式(Observer Pattern)

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

遇见伯灵说的博客 1246

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Camera2Demo

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

C#设计模式:观察者模式(Observer Pattern)

一,什么是观察者模式(Observer Pattern)? 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象 二,代码如下: 在一开始我们先定义两个类,一个是Chinese类(被观察者) ,另一个是Jan类(观察者),观察者设计模式是当被观察者状态发生改变,从而触发观察者的事件 using Sy...

dcujcivw769565的博客 175

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

设计模式精讲 Day 19:观察者模式(Observer Pattern)

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知并更新。核心思想:解耦发布者与订阅者,实现松耦合的通信机制。通过本篇文章的学习,我们掌握了观察者模式的核心思想、实现方式以及在实际项目中的应用。观察者模式是一种非常实用的行为型设计模式,尤其适合需要对象间松耦合通信的场景。

在未来等你的专栏 1032

WINCC7.3破解文件

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

[设计模式] 行为型:观察者模式(Observer Pattern)

文章目录什么是观察者模式设计与实现主动观察者模式被动观察者模式 什么是观察者模式 顾名思义,观察者就是要对目标进行观察,当目标行为有所变动时,自己及时作出反应。 观察的具体方法有很多种,从编程的角度来理解,观察者要达到观察的目的,主要有两种策略: 观察者主动观察目标状态,实时或半实时的对目标对象进行监听,属于面向过程的编程思想 观察者被动接收消息,当目标状态发生改变时,目标对象主动通知观察者,属于面向对象的编程思想 我将第一种策略称之为主动观察者模式,第二种策略称之为被动观察者模式,名字是我随便取的,读

不忘初心 方得始终 1128

设计模式系列之三:观察者模式(Observer Pattern)

Normal07.8 磅02falsefalsefalseMicrosoftInternetExplorer4<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:

hillspring 1933

设计模式:观察者模式(Observer Pattern、JDK实现)

import java.util.Observable; import java.util.Observer; /** * 观察者模式(JDK实现)。 * @author Bright Lee */ public class JdkObserverPattern { public static void main(String[] args) { AnimalKeeper su...

look4liming的专栏 333

设计模式 Day 4:观察者模式(Observer Pattern)深度解析

中文释义在对象间建立一种一对多的依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。设计哲学松耦合原则:主题与观察者之间通过抽象接口交互开闭原则:新增观察者无需修改主题代码事件驱动架构:状态变化触发连锁反应核心价值:建立松耦合的对象间动态依赖关系实现要点定义清晰的Subject-Observer接口管理观察者注册机制合理选择推/拉模型适用场景事件驱动架构跨模块状态同步需要广播通知的场合。

Interview_TC的博客 1311

设计模式二十:观察者模式(Observer Pattern)

定义了一种一对多的依赖关系,允许多个观察者(也称为订阅者)对象同时监听一个主题对象,当主题对象发生变化时,所有依赖于它的观察者都会收到通知并自动更新。

qq_40537587的博客 1301

【图解设计模式系列】The Observer Pattern: 观察者模式

什么是观察者模式?这可真的是个奇怪的命名,完全不明白为什么这样命名?看看定义: 定义对象间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 观察者模式又被称为发布-订阅模式(publish-subscribe)。 英文解释: Publishers (Subject) + Subscribers (Observers) = Observer Pattern defines a one to many dependency between objects so

Tech in Pieces 596

Java设计模式:观察者模式(Observer Pattern)

观察者模式:类似于报纸和杂志的订阅出版者+订阅者=观察者模式1.报纸的业务就是出版报纸。 2.向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订阅用户,你就会一直收到新报纸。 3.当你不想再看报纸时,取消订阅,他们就不会再送新报纸来。 4.只要报社还在运营,就会一直有人或单位向他们报纸或取消报纸。 这里:你要把出版者改成“主题(Subject)”,订阅者改成“观察者(O

D.D.U的博客 2612

设计模式心得:观察者模式 (observer pattern)

应用很好理解:一个subject,希望在更新的时候 (更新的定义可以从setChanged方法获得,例如,小于5的更新不通知,见下),自动通知一个observer list。 每个观察者收到更新后的动作与subject无关,大家可以自由加入/离开observer list。 java.util自带Observer, 类图 (来源Head First Design Patterns):

cykic的专栏 614

设计模式笔记——(三:观察者模式 Observer Pattern)

观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

小雨的专栏 2495

设计模式三:观察者模式 (Observer Pattern)

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象(称为"主题"或"可观察对象")的状态发生改变时,所有依赖它的对象(称为"观察者")都会自动收到通知并更新。

weixin_43050542的博客 402
上一篇: 设计模式:单例模式(Singleton)
下一篇: Leetcode743. 网络延迟时间
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值