设计模式学习之——观察者模式

USB2.0信号完整性测试之眼图 名称线缆颜色引脚描述红色绿色白色GND黑色。 阅读详情

观察者模式是一种行为型设计模式,它用于在对象之间建立一对多的依赖关系。

一、定义与角色

  • 定义:
    • 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
  • 主要角色:
    • 主题(Subject):也称为被观察者,它维护一个观察者列表,并提供注册、删除和通知观察者的方法。
    • 观察者(Observer):对主题的状态变化感兴趣,并在状态变化时做出响应。它定义了一个更新方法,用于接收和处理主题的通知。
    • 具体主题(ConcreteSubject):实现了主题接口,维护了观察者的集合,并在状态变化时通知所有观察者。
    • 具体观察者(ConcreteObserver):实现了观察者接口,并对主题的状态变化做出具体的反应。

二、工作原理

  1. 注册观察者:观察者通过调用主题的注册方法,将自己添加到主题的观察者列表中。
  2. 状态变化通知:当主题的状态发生变化时,它会遍历观察者列表,并调用每个观察者对象的更新方法,将新的状态传递给观察者。
  3. 观察者响应:观察者对象接收到主题的通知后,执行相应的操作,以便响应状态的变化。

三、优缺点

优点: 

  1. 解耦性:主题和观察者之间是松耦合的,它们之间通过抽象的接口进行通信,使得它们可以独立地进行修改和扩展。
  2. 可扩展性:可以方便地增加新的观察者,而无需修改主题的代码。
  3. 灵活性:观察者模式支持同步和异步通知,观察者可以在不同的线程中执行更新操作。
  4. 规范性:观察者模式定义了主题和观察者之间的一套规范,使得代码更具可读性和可维护性。

缺点/注意事项:

  1. 循环依赖:避免在观察者和主题之间建立循环依赖关系,否则可能导致系统崩溃。
  2. 性能问题:当观察者数量非常多时,通知操作可能会非常耗时。可以考虑使用异步通知、事件总线等优化方法。
  3. 内存泄漏:如果观察者对象不再需要,确保从主题的观察者列表中删除它们,以避免内存泄漏。
  4. 线程安全:在多线程环境中,确保对观察者列表的访问是线程安全的。可以使用同步机制、并发集合等来实现。

四、应用场景

  1. 数据变化通知:当对象的状态发生变化,需要通知多个对象进行更新时,可以使用观察者模式。例如,股票市场的系统中,投资者需要实时获取股票价格的变化。
  2. 分布式事件系统:需要将事件从一个组件广播到多个组件时,可以使用观察者模式。例如,GUI框架中的事件处理机制,用户的操作需要通知多个界面组件。
  3. 系统状态监控:当系统的状态变化需要被监控时,可以使用观察者模式。例如,应用程序的日志系统、系统监控工具等。

五、示例代码

以下是一个简单的观察者模式示例代码,用于演示其工作原理:

// 主题接口
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主题类
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new LinkedList<>();
    private int state;

    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        observers.forEach(observer -> observer.update(state));
    }
}

// 观察者接口
public interface Observer {
    void update(int state);
}

// 具体观察者类
public class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(int state) {
        System.out.println(name + "接收到了更新请求,新的状态:" + state);
    }
}

// 测试类
public class ObserverPatternExample {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        Observer observer1 = new ConcreteObserver("观察者1号");
        Observer observer2 = new ConcreteObserver("观察者2号");

        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        subject.setState(10); // 输出:观察者1号接收到了更新请求,新的状态:10;观察者2号接收到了更新请求,新的状态:10
    }
}

六、与发布-订阅模式的比较

观察者模式和发布-订阅模式都是软件设计模式,用于实现对象间的一对多依赖关系,但它们之间存在一些关键的区别。以下是对这两种模式的详细比较:

定义与特点
  • 观察者模式:

    • 定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
    • 主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
    • 观察者和主题之间是抽象耦合的,即它们之间通过接口或抽象类进行交互,而不是直接依赖具体实现。
  • 发布-订阅模式:

    • 也称为发布/订阅模式或消息传递模式。
    • 在这种模式下,消息的发送者(发布者)和接收者(订阅者)不需要建立直接的联系,也不需要知道对方的存在。
    • 消息的传递通过一个被称为代理(Broker)或调度中心的中间角色来完成。发布者将消息发布到代理上,而订阅者则从代理订阅感兴趣的消息。
结构与角色
  • 观察者模式:

    • Subject(主题/被观察者):维护一个观察者列表,提供注册、删除和通知观察者的方法。
    • Observer(观察者):定义了一个更新接口,用于接收来自主题的通知。
    • ConcreteSubject(具体主题):实现Subject接口,维护观察者列表,并在状态变化时调用所有观察者的更新方法。
    • ConcreteObserver(具体观察者):实现Observer接口,定义当接收到主题通知时的具体行为。
  • 发布-订阅模式:

    • 发布者(Publisher):负责将消息发布到主题上。发布者一次只能向一个主题发送数据,且发布消息时无需关心订阅者是否在线。
    • 订阅者(Subscriber):通过订阅主题接收消息。订阅者可一次订阅多个主题,从而接收感兴趣的消息。
    • 代理(Broker):负责所有消息的路由和分发工作。代理接收到发布者的消息后,根据主题将其分发给相应的订阅者。
    • 主题(Topic):用于标识消息的类别。每个消息都包含一个主题,订阅者通过订阅主题来接收感兴趣的消息。
区别与联系
  • 区别:

    • 耦合性:观察者模式中,发布者与订阅者直接关联,发布者维护观察者列表,发布者状态变更通知订阅者。而在发布-订阅模式中,订阅者与发布者相互不了解,通过事件中心(代理)进行通信,实现了完全松耦合。
    • 角色数量:观察者模式中只有两个主要角色:观察者和被观察者。而发布-订阅模式中则包含四个角色:发布者、订阅者、代理和主题。
    • 应用场景:观察者模式多用于单个应用内部,而发布-订阅模式则更多的是一种跨应用的模式(cross-application pattern),如消息中间件等。
  • 联系:

    • 两者都实现了对象间的一对多依赖关系,当某个对象的状态发生变化时,都会通知所有依赖的对象。
    • 两者都关注对象之间的通讯,并致力于保持对象间的低耦合和高协作性。

综上所述,观察者模式和发布-订阅模式在定义、结构、耦合性、角色数量和应用场景等方面都存在明显的区别。选择哪种模式取决于具体的应用需求和设计考虑。

最后,观察者模式是一种强大的设计模式,它能够在对象之间建立一对多的依赖关系,并自动通知观察者进行更新。然而,在实际应用中需要注意其潜在的性能问题和循环依赖问题。

【python数据处理】python实现vlookup字符串模糊匹配及在实战中的应用(FuzzyWuzzy库) 利用FuzzyWuzzy库匹配字符串1. 背景前言2. FuzzyWuzzy库介绍2.1 安装2.1 fuzz模块2.1.1 简单匹配(Ratio)2.1.2 非完全匹配(Partial Ratio)2.1.3 忽略顺序匹配(Token Sort Ratio)2.1.4 去重子集匹配(Token Set Ratio)2.2 process模块2.2.1 extract提取多条数据2.2.2 extractOne提取一条数据3. pandas实战应用3.1 公司名称字段模糊匹配3.1.1 参数讲解:3.1.2 阅读详情

相关推荐

从FinFET到NanoSheet:一文看懂TSMC制程技术的架构革命与性能飞跃

本文深入解析了TSMC从FinFET到NanoSheet的制程技术架构革命。FinFET通过三维立体结构解决了短沟道效应,而NanoSheet采用环绕栅极设计,实现了更强的静电控制与设计灵活性,结合EUV光刻技术,共同推动了芯片性能与能效的飞跃,为下一代AI与高性能计算奠定基石。

i3j4k5的博客 288

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

0. 前言   观察者模式在许多地方都能够用到,特别是作为MVC模式的一部分,在MVC中,模型(M):存放数据,视图(V):显示数据。当模型中的数据发生改变时,视图会得到通知,这是典型的观察者模式。 1. 定义   观察者模式:定义了一对多的关系,一个对象作为主题,它维护了一系列的依赖对象,当主题的状态发生改变时,会自动地通知依赖对象(通常通过调用依赖对象的方法来实现)。   官...

diaoxie6172的博客 139

二手分析仪器改造实战:如何用PMT搭建荧光检测电路(附完整电路图)

本文详细介绍了如何利用二手分析仪器中的光电倍增管(PMT)核心部件,进行荧光检测电路的实战改造。内容涵盖从PMT工作原理理解、高压供电电路设计、低噪声前置放大(跨阻放大器)到信号调理的完整流程,并提供了关键电路图与调试排错指南,旨在帮助电子爱好者与工程师低成本构建稳定、高灵敏度的专业检测系统。

weixin_29234239的博客 441

设计模式 - 学习笔记 - ObserverPattern 观察者模式(Event事件模式)

设计模式 - 学习笔记 - 观察者模式ObserverPattern学习总结基本逻辑对比`订阅发布模式`对比`访问者模式` 学习总结 基本逻辑 定义发布者和观察者两个接口,然后实现1个发布者和n个观察者。 每个观察者都实现了自己的update(msg)方法来更新数据。 发布者维护一个观察者列表,并实现一个通知方法notify()遍历列表逐个调用观察者.update方法传入msg 对比订阅发布模式 观察者模式与订阅发布模式。后者对前者进一步拆分细化,将维护列表与发布通知工作独立出来作为调度中心。 强行

灵台方寸山斜月三星洞 555

基于STM32F407标准库与SimpleFOC实现无刷电机2804位置闭环控制的实战解析

本文详细解析了基于STM32F407标准库与SimpleFOC算法实现2804无刷电机位置闭环控制的实战过程。通过硬件选型、速度闭环调试到位置环PID参数整定,提供了完整的工程实现方案和抗饱和策略,帮助开发者掌握高精度电机控制技术。

oauth7security的博客 918

手把手拆解固态电池成本:2030年真能比液态电池便宜30%吗?

本文深度解析固态电池成本结构,探讨2030年实现比液态电池便宜30%的可行性路径。通过拆解正极材料、负极材料和固态电解质的成本演变,分析关键技术对降本的影响,并预测产业链协同效应下的成本优化趋势。文章指出,在材料创新、设备国产化和政策支持等多重因素推动下,固态电池有望在2030年实现显著降本目标。

kite3的博客 403

设计模式学习笔记--观察者模式(Observer Pattern)

概念观察者模式定义了对象之间的一对多的依赖关系,当一个对象(被观察者)改变状态时,它的所有依赖者(观察者)都会收到通知并更新设计原则为了交互对象之间的松耦合设计而努力理解在这个模式中存在两个角色,一个是 “被观察者”,另一个是 “观察者”,他们之间的关系类似现实生活中的“报刊订阅”,其中被观察者是“报社”,观察者是“用户”,用户在报社购买报刊订阅服务后,报社一旦有新报刊发布,就会通知用户,而如果用户

classTC的博客 1330

解决ArcGIS-OpenStreetMap Toolbox-Load OSM File错误

在安装成功OpenStreetMap Toolbox后,首次运行Load OSM File工具,出现以下错误

Zjf的博客 8820

认真学习设计模式之观察者模式(Observer Pattern)

【1】观察者模式定义于特点 ① 观察者模式定义 观察者模式也叫(发布-订阅模式)定义了对象之间的一对多的依赖,当一个对象(主题)改变状态时,它的所有依赖者都会收到通知并自动更新。 在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。主题与观察者都是用接口,观察者使用主题的接口向主题注册,而主题利用观察者的接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点–可观察者不知道观...

小小默:进无止境 803

YOLOv8+SAM强强联合:用分割“喂“检测,复杂背景下作物AP从72%干到77.7%,杂草误检降60%

目标与背景高度相似:如农业(作物vs杂草)、工业(零件vs台面)、医学(病灶vs正常组织);遮挡严重的场景:如密集人群(人被遮挡)、森林(树木被枝叶遮挡);小目标密集场景:如无人机航拍(远处小目标易混背景)。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 793

EtherCAT总线运动控制学习笔记(RXXW_Dor)

说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基本一致,下面我们简单认识下上面是对象字典。

RXXW_Dor的博客 5429

《Java设计模式学习》观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象发生改变时,它的所有观察者都会收到通知并进行相应的处理。在观察者模式中,主题对象通常被称为被观察者(Observable),而观察者对象则被称为观察者(Observer)。被观察者对象会维护一个观察者列表,当自身状态发生改变时,会遍历观察者列表并调用每个观察者的更新方法来通知它们。

一个不断前行的程序者 246

Go语言面试:面试中经常被问到的50个经典面试题(附参考答案)

Go语言核心知识点摘要 基础语法与数据结构 make和new区别:new分配零值内存返回指针,make初始化引用类型返回实例 Slice底层:包含指针、长度、容量的结构体,多个slice可共享底层数组 nil与空slice:nil指针为nil,空slice指针非nil但JSON编码不同 Map原理:哈希表实现,非线程安全,扩容策略影响性能 for range注意:循环变量是拷贝,map遍历无序 defer执行:LIFO顺序,函数返回前执行 Struct比较:仅当所有字段可比较时才可比较 参数传递:只有值传递

数据知道的博客 4721

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

设计模式学习--观察者模式(Oberser Pattern) 2013年5月18日 天气:热!  下午15:28  设计模式学习中 学习者:小巫 什么是观察者模式? 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 怎么设计一个观察者模式的程序? 确定两个对象:1. 主题   2.观察者

巫山老妖 3934

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

尚硅谷设计模式学习(18)---[观察者模式( observer pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! ml情景引入观察者模式 情景引入 天气预报项目需求: 1 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(发布到自己的网站或第三方) 2 需要设计开放型API,便于其他第三方也能接入气象站获取数据。 3 提供温度、气压和湿度的接口 4 测量数据更新时,要能实时的通知给第三方 先试试用传统方案解决问题, 在得到数据后就更新到气象站CurrentCond

从零开始的异世界JAVA学习 283

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

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

python学习 - 设计模式 - 观察者模式实例代码

【代码】python学习 - 设计模式 - 观察者模式实例代码。

weixin_tank88921的博客 388

设计模式学习之观察者模式

这是设计模式系列的第7篇文章,在这之前我们已经介绍过了设计模式中最常使用的工厂模式和策略模式,本文将详细介绍一下观察者模式。

哆啦A瑶的博客 533

设计模式之观察者模式学习总结

定义:对象之间多对一的关系时的设计方案, 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 场景:订阅报刊业务的场景。 原理:Subject 具有登记注册观察者、移除观察者和通知观察者的三个核心方法。 观察者一个核心行为方法:给Subject通知观察者调用的方法。 由Subject来通知和调用注册进来的观察者的行为方法。 优点: 1.以集合的方式来管理依赖对象(Observer),三个核心方法:注册、移除和通知观察者。 2.遵守OCP原则,增加观察者时只需要增加Observer而不用修

whatwhyhaodo的博客 288

观察者模式 - 设计模式学习

观察者模式 - 设计模式学习   观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使观察者对象它们能够自动更新自己。   说白了就是说一个对象,能够通过另外一个对象(通知者)...

122

学习设计模式-观察者模式

说明:如果你需要将一个复杂的对象或功能的构建流程和表示分离,使得同样的构建流程,也可以创建出不同的表示,例如麦当劳做炸东西,炸东西的流程是一样的,但放入的材料不同,炸出来的东西不一样(例如鸡排、鸡腿、鸡翅等) 需求:用户要个炸鸡腿 解决方式: a.定义一个产品类(炸东西); b.定义一个构建产品部分或过程的抽象类(炸东西的步骤); c.分别根据需求不同

sunnyliuqi的专栏 228

学习设计模式《十一》——观察者模式

 观察者模式的本质【触发联动】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1015

java设计模式学习之【观察者模式】

这篇教程不仅提供了观察者模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1825

基于Python学习《Head First设计模式》第二章 观察者模式

【代码】基于Python学习《Head First设计模式》第二章 观察者模式。

wzx77的博客 790

设计模式学习——观察者模式

如果我们现在向一家报社订阅了一份报纸,那么这家报社不管今天我们有没有心情看报纸,它都会把报纸送过来。有一天我们实在是不想看这家的报纸了,我们如果取消了订阅,那么从此以后报社再也不会送报纸到我们家了。 上面这一段情景,其实和观察者模式的工作性质是一样的。 观察者模式 定义:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。 其实就是有人发布信息,...

lpckr94的博客 302

快速学习设计模式-观察者模式

我对设计模式的理解: 多数开发人员应该知道设计模式这个东西;部分人知道23种设计模式;少数人能够熟练使用设计模式,极少数人精通设计模式。 其实23种设模式,其实只是入门,这就相当于你学英语,学会了26个英文字母,才能开始学习单词。同样23种设计模式,只是字母表,想要到精通的层次,要能够灵活的使用设计模式,灵活的组合设计模式。 设计模式是我短期计划中的一部分,我的文章致力于最快最简单的掌握每一个设计模式。 我的设计模式相关的文章,都会在开篇使用一句话,来描述一个设计模式! 该模式设计关键...

Angus 281
上一篇: 设计模式学习之——模板方法模式
下一篇: Springboot项目集成Mybatis-Plus,多数据源配置,写主读从
Jack_abu
博客等级 码龄10年 633粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Jack_abu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值