观察者模式深入理解

【设计模式】11.深入理解 Java 中的观察者模式 定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式通常用来实现事件监听机制,当某个事件发生时,通知所有的观察者对象进行相应的处理。// 观察者接口// 被观察者接口观察者模式是一种强大且灵活的设计模式,广泛应用于需要通知机制的场景。通过将对象之间的依赖关系解耦,它提高了系统的可扩展性和可维护性。Java 标准库提供了内置的观察者模式实现,但手动实现更具灵活性。 阅读详情

观察者模式

要多想,理解后闭上眼睛,想象下生活中哪些场景用到,进而回顾平时代码生涯中哪些场景可以用该模式去实现。

1、概念

观察者模式是什么

有时被称作发布/订阅模式、模型-视图模式,它是对象行为型模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
在这里插入图片描述
主题对应观察者主要有两大类和四小类
两大类:主题、观察者
四小类:抽象主题,具体主题,抽象观察者,具体观察者

具体主题注入所有观察者,主题变动通知观察者,注册观察者,取消观察者
具体观察者注入主题,然后调用主题注册方法把自己注册进主题

画UML类关系图,理清关系

工具:PowerDesigner (离线工具),在线工具(https://www.processon.com/)

在这里插入图片描述

1. 主题Subject

首先定义一个观察者数组,并实现增、删及通知操作。它的职责很简单,就是定义谁能观察,谁不能观察,用Vector是线程同步的,比较安全,也可以使用ArrayList,是线程异步的,但不安全。

public class Subject {

    //增加一个观察者
    void addObserver(Observer observer);
    
    //删除一个观察者
    void deleteObserver(Observer observer);
    
    //通知所有观察者
    void notifyObserver();
   
}

2. 抽象观察者Observer

继承Subject类,在这里实现具体业务,在具体项目中,该类会有很多变种。

 public interface Observer {
     //更新
     public void update();
 }

3. 具体主题

继承Subject类,在这里实现具体业务,在具体项目中,该类会有很多变种。
public class ConcreteSubject extends Subject {

//观察者数组
private Vector<Observer> oVector = new Vector<>();

//增加一个观察者
public void addObserver(Observer observer) {
    this.oVector.add(observer);
}

//删除一个观察者
public void deleteObserver(Observer observer) {
    this.oVector.remove(observer);
}

//通知所有观察者
public void notifyObserver() {
    for(Observer observer : this.oVector) {
        observer.update();
    }
}

}


## 4. 具体观察者

```c
public class ConcreteObserver implements Observer {

    @Override
    public void update() {
        System.out.println("收到消息,进行处理");
    }

}

5. Client客户端

首先创建一个被观察者,然后定义一个观察者,将该被观察者添加到该观察者的观察者数组中,进行测试。

public class Client {
    
    public static void main(String[] args) {
        //创建一个主题
        ConcreteSubject subject = new ConcreteSubject();
        //定义一个观察者
        Observer observer = new ConcreteObserver();
        //观察
        subject.addObserver(observer);
        //开始活动
        subject.doSomething();
    }
    
}

闭上眼睛想象一下生活中有哪些类似的场景,能想多少想多少

  1. 手机丢了,委托别人给其他人发消息通知
  2. 通知老师/老板来了
  3. 拍卖,拍卖师观察最高标价,然后通知给其它竞价者竞价
  4. 在一个目录下建立一个文件,会同时通知目录管理器增加目录,并通知磁盘减少空间,文件是被观察者,目录管理器和磁盘管理器是观察者
  5. 猫叫了一声,吓着了老鼠,也惊到了主人,猫是被观察者,老鼠和人是观察者
  6. 疫情期间:一个人从疫区过来,则这个人是被观察的对象,当体温超过37度,保安拒绝出入公共场所、社区进行登记、医院找拉去隔离治疗、健康码由绿码显示为红码

代码实现案例6(一个人从疫区回来)

代码结构
在这里插入图片描述

1、一个从疫区回来的人

/**
 * 从疫区回来的人
 */
public class EpidemicAreaPerson {
	//体温
    private int temperature;
    //姓名
    private String name;

    public int getTemperature() {
        return temperature;
    }

    public void setTemperature(int temperature) {
        this.temperature = temperature;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2、测体温事件抽象

/**
 * 测体温事件抽象
 */
public interface ThermometerEvent {

    //注册观察者
    void registerObserver(Observer observer);

    //移除观察者
    void removeObserver(Observer observer);

    //通知所有观察者
    public void notifyObserver(EpidemicAreaPerson epidemicAreaPerson);
}

3、测体温事件具体实现

public class ThermometerEventImpl implements ThermometerEvent {

    //观察者数组
    private Vector<Observer> oVector = new Vector<>();

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

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

    @Override
    public void notifyObserver(EpidemicAreaPerson epidemicAreaPerson) {
        if (epidemicAreaPerson.getTemperature() > 37) {
            for (Observer observer : this.oVector) {
                observer.update(epidemicAreaPerson);
            }
        } else {
            System.out.println("没毛病,因为他是老铁");
        }
    }

}

4、观察者抽象

/**
 * 观察者
 */
public interface Observer {
    //更新
    public void update(EpidemicAreaPerson epidemicAreaPerson);
}

5、具体观察者-医生

public class DoctorObserver implements Observer {
    @Override
    public void update(EpidemicAreaPerson epidemicAreaPerson) {
        System.out.println("医生把" + epidemicAreaPerson.getName() + "带走隔离治疗" + "疑似者温度" + epidemicAreaPerson.getTemperature());
    }
}

6、具体观察者-保安

public class BaoAnObserver implements Observer {
    @Override
    public void update(EpidemicAreaPerson epidemicAreaPerson) {
        System.out.println("疑似者温度" + epidemicAreaPerson.getTemperature() + "保安拒绝" + epidemicAreaPerson.getName() + "出入公共场所");
    }
}

7、模拟事件过程

        //一个超过37度的人
        EpidemicAreaPerson epidemicAreaPerson = new EpidemicAreaPerson();
        epidemicAreaPerson.setName("xiaohong");
        epidemicAreaPerson.setTemperature(38);
        //创建一个主题
        ThermometerEvent subject = new ThermometerEventImpl();
        //定义一个观察者
        Observer observer = new DoctorObserver();
        Observer baoAnObserver = new BaoAnObserver();
        //观察
        subject.registerObserver(observer);
        subject.registerObserver(baoAnObserver);
        //开始活动
        subject.notifyObserver(epidemicAreaPerson);

后面还可以加这样的场景,医生观察者再作为主题,如果该疑似测核酸显示阳性,则上报国家统计,通报媒体,通知疑似者家人。

深入理解观察者模式及其Java实现 在观察者模式中,主题(Subject)是一个核心组件,它维护了一组观察者(Observer)对象,并在状态发生变化时通知它们。主题定义了一系列方法,如注册、移除观察者,以及通知观察者的方法。主题的实现可能包含一个观察者列表,用于跟踪注册的观察者,以及一个状态变量,用于记录自身的变化。当状态变化时,主题会遍历观察者列表,调用每个观察者的update方法。为了让一个自定义类支持观察者模式,需要让它继承Observable类。 阅读详情

相关推荐

深入理解观察者模式:设计与实现

本文将深入探讨观察者模式,这是一种在软件设计中广泛应用的设计模式。通过模拟报纸订阅的情景,我们会详细解释观察者模式的工作原理,包括主题(Subject)和观察者(Observer)之间的关系,以及如何在对象状态改变时自动通知观察者。我们还将通过类图和示例代码来说明如何在代码中实现观察者模式,以及它与发布-订阅模式的区别。

weixin_42522857的博客 379

设计模式------观察者模式(以警察小偷为例)

定义 对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 通俗讲,被观察者状态改变,观察者将得到通知,进行相应操作。 实现 以警察小偷为例 功能:小偷(被观察者)状态改变时通知所有警察(观察者)实行抓捕操作。【仅作事例,不考虑实际逻辑】 自定义观察者接口 public interface JingCha { void zhu...

壑壑哒的博客 760

Java实现观察者模式示例:深入理解与应用

观察者模式是一种设计模式,它定义了对象间的一种一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在软件工程中,这是一种常用的模式,被广泛应用于图形用户界面、事件处理机制以及各种框架中。观察者模式是一种设计模式,允许对象之间存在一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。在Java中,观察者模式可以通过接口和类来实现,其中接口和类是Java标准库中提供的支持观察者模式的关键组件。

weixin_29050829的博客 1082

设计模式(十五):观察者模式

观察者模式中,一个被观察者管理所有相依于它的观察者物件,并且在本身的状态改变时主动发出通知。这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 //抽象观察者 public interface Watcher { public void update(); } //观察者1 public class Security implements Watcher { @Override public void update() { Syst

qq_34748010的博客 792

Vue.js观察者模式深入理解与实践

本文将探讨Vue.js中的观察者模式,重点分析如何使用watchers来响应数据变化,实现复杂交互。通过具体的代码示例,深入讲解如何使用deep选项来观察对象内部属性变化,以及如何利用watchers来保存用户选择和排序列表。

weixin_29840475的博客 429

飞腾D2000 BIOS编译避坑指南:PCIE拆分、S3电源与过温保护配置详解

本文详细解析飞腾D2000 BIOS编译中的关键配置技巧,包括PCIE拆分模式优化、S3电源管理适配及过温保护设置。通过实战案例和参数调优建议,帮助开发者规避常见陷阱,充分发挥国产高性能计算平台的硬件潜力。特别针对BIOS编译过程中的隐蔽问题提供解决方案。

weixin_33704234的博客 534

观察者模式

简介 观察者模式,首先设置一个观察者,针对某些事件或者对象进行观察。通过观察,观察者可能会做出一些反应,也可能不会。比如果保安观察监控,平常用户出入保安不会有反应,一旦发现小偷,保安就要立即做出相应的举动。 正文 观察者模式,也被称为订阅发布模式,主要有两种模式,拉模式和推模式,接下来我们演示一下: 拉模式: class Subscribed: '''被订阅对象''' def __init__(self) -> None: self.observer.

Sean_TS_Wang的博客 353

AI报告撰写实战指南:从提示词工程到全流程优化的底层逻辑与实践突破

传统AI写作常被诟病为“信息拼贴”——模型虽能生成文本,却常出现逻辑断裂、数据矛盾、风格不符等问题。而“全流程优化”则是通过系统化设计,将报告生成拆解为需求解析→数据对齐→提示词设计→初稿生成→迭代优化→格式适配六大环节,每个环节均通过技术手段提升输出质量。提示词工程:本质是通过结构化指令(如角色设定、任务分解、格式约束、示例引导)精准控制模型输出方向,是连接用户需求与模型能力的“翻译器”。全流程优化。

2501_92808811的博客 884

深入理解[观察者模式]原理与技术

观察者模式(Observer Pattern)也叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式。这个模式的一个最重要的作用就是解耦。也就是将被观察者和观察者进行解耦,使得他们之间的依赖性更小,甚至做到毫无依赖。 观察者模式的定义:该模式定义了对象之间的一对多依赖关系,Subject 对象是一,Observer 对象是多。当 Subject 对象的...

weixin_34129696的博客 368

父子Agent架构:解决AI系统上下文污染的技术方案

在AI系统设计中,上下文管理是核心挑战之一。传统单Agent架构在处理复杂任务时,常面临上下文无限膨胀导致的信息淹没和性能下降问题。父子Agent架构通过职责分离和上下文隔离机制,采用分而治之的思想,将大任务拆解为多个子任务由专门子Agent处理。该架构中父Agent负责任务规划和结果汇总,子Agent执行具体任务后立即销毁中间状态,通过精炼摘要进行通信。这种设计不仅能有效控制上下文长度,还能提升系统稳定性和执行效率,特别适用于编程辅助、自动化测试等需要多步骤处理的场景。父子Agent架构体现了计算机科学中

weixin_42531710的博客 352

Quartus原理图设计入门:从半加器到4位全加器的保姆级教程

本文提供Quartus原理图设计入门教程,详细讲解从半加器到4位全加器的实现过程。通过原理图输入法,逐步构建数字电路设计基础模块,涵盖环境搭建、逻辑设计、层次化实现及功能验证等关键步骤,帮助FPGA初学者快速掌握Quartus工具链和加法器设计方法。

weixin_29291185的博客 464

深入理解Java设计模式——观察者模式

这里写目录标题一、什么是观察者模式二、观察者模式应用场景三、观察者模式原理类图四、观察者模式简单的实现1. 抽象观察者2. 抽象主题者3. 具体主题4. 具体观察者5. 运行测试五、JDK自带观察实现消息发送1. 自定义主题2. 自定义观察者3. 运行监听开始六、Spring封装事件监听七、使用观察者模式模拟微信公众号 一、什么是观察者模式 在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。 其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息

记录各种Bug解决案例及日常学习内容 754

7系列ZYNQ硬件调试:Vitis无法识别ARM DAP的排查与解决

本文详细分析了Xilinx 7系列ZYNQ芯片在Vitis开发环境中无法识别ARM DAP的常见问题及解决方案。从硬件设计检查(电源系统、时钟电路)、JTAG连接诊断到软件环境排查,提供了全面的调试指南。特别针对ARM DAP初始化失败的情况,给出了实用的排查步骤和预防措施,帮助开发者快速定位和解决类似问题。

weixin_33737134的博客 513

深入理解观察者模式(Observer Pattern)

当用户与 GUI 组件进行交互时,观察者会接收到通知并执行相应的操作,从而实现 GUI 的实时更新和交互。在现实生活中,我们经常会遇到这样的情况:当一个对象的状态发生改变时,其他对象也需要做出相应的变化。当事件发生时,观察者会收到通知并执行相应的处理逻辑,从而实现程序的事件驱动和响应机制。对象,并将后者注册为前者的观察者。然后,我们模拟了几次气象数据的变化,并观察观察者的更新情况。然后,模拟了几次气象数据的变化,并观察观察者的更新情况。类是主题,它维护了观察者列表,并提供了方法来注册、移除和通知观察者。

jakelihua 982

github创建账号第一步始终出错

github创建账号总结:第一次注册GitHub,填好用户名邮箱密码后进入下一步就卡在哪里,上面还提示Unable to verify your captcha response等,进入网址的解决办法以及下载其他的浏览器也无法解决,用手机浏览器抱着试一试的心态竟然成功了,分享给大家。手机下载谷歌浏览器,进入GitHub正常注册,能向下继续,邮箱验证完以后再用电脑登陆就ok啦

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 4373

倍福PLC--PERSISTENT断电保持数据和BOOT中各文件对应的解析

将D:\TC3程序\TwinCAT Project146\TwinCAT RT(x86)\Plc 文件夹的中三个替换文件复制到:G:\TwinCAT\3.1\Boot\Plc完成替换,如下图。(2) 找到程序所存的路径,编程电脑的D:\TC3程序\TwinCAT Project146路径下,并选择对应系统平台TwinCAT RT(x86)(3) 控制器断电,拔出内存卡,使用读卡器,在编程电脑中打开:(本次测试读卡器为G盘)(5) 开机完成后,TwinCAT自动运行,当前闪灯频率为50ms。

weixin_41883890的博客 2340

深入理解设计模式之观察者模式

观察者模式定义了对象之间的一种一对多依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖它的对象(观察者)都会得到通知并自动更新。简单来说,观察者模式就像是一个消息发布与订阅系统,被观察者充当消息发布者,而观察者则是订阅者,当被观察者有新消息时,会自动推送给所有订阅的观察者。例如,在一个社交媒体平台上,用户发布一条动态,关注该用户的其他用户都会收到通知,这就是观察者模式的典型应用。

weixin_45969711的博客 846

【RT-DETR有效改进】手把手带你调参RT-DETR,1:1复现官方版本实验环境

本文是带大家进行调参,利用ultralytics仓库1:1复现RT-DETR官方实验环境,从而在后期发表论文 的时候省去一些不必要的麻烦,例如被审稿人提出质疑,本文的调参内容均有依据,根据RT-DETR官方Github上发布的版本进行设置本文的调参以ResNet18为例,其余的何其的调参基本一致。RT-DETR剑指论文专栏,持续复现各种顶会内容——论文收割机RT-DETR。

Snu77的博客 9921

设计模式之深入理解观察者模式

本篇文章分为两部分,其中第一部分介绍什么是观察者模式,第二部分介绍观察者模式值得思考的地方。 第一部分-观察者模式介绍 一.定义 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。 二.解决的问题 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 三.使用场景 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知 四

差池 283

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深入理解观察者模式及其JavaScript实现

Hi,我是布兰妮甜!观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在事件处理系统、数据绑定和发布-订阅系统中广泛应用。

chaosweet的博客 837

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

php观察者模式有什么好处,PHP 观察者模式深入理解与应用分析

本文实例讲述了PHP 观察者模式。分享给大家供大家参考,具体如下:用模式开发的优点是,能让我们的逻辑结构以及代码更加清晰,便于维护!而我们为什么要用 “观察者模式”?这就需要从实际运用中来理解才能更好的运用!用如下的情境来说明吧。事例,开始时我被安排做项目的登录,很快我就完成了。然后产品提出了另一个需求,用户登录后,给他们推送一条实时消息!然后我在登录成功的逻辑后加了一段代码,完成了登录后的实时消...

weixin_35355756的博客 192

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

设计模式-深入理解观察者模式

观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。   观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。   观

xietingcandice的专栏 759

深入理解RxJava中的观察者模式

对于Android开发者来说,RxJava应该是不陌生的,如果读者不了解RxJava是什么,推荐两篇文章给大家 RxJava中文文档 给 Android 开发者的 RxJava 详解 通过这两篇文章相信你能对RxJava有一个初步的了解,这篇文章不打算介绍RxJava的具体使用方式,因为我觉得使用方式在文档中其实写的很清楚,这些属于“术”的层面,站在更高层次去理解RxJava的原理和核心内容才...

weixin_33946605的博客 606

Java设计模式五:深入理解观察者模式

前言 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 认识观察者模式 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对...

Mr_lisj的博客 325

深入理解23种设计模式(16) -- 观察者模式

@[top]

浪人与酒 749
上一篇: 深入理解Threadlocal
下一篇: 原型模式通俗易懂
沐果果
博客等级 码龄10年 19粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值