【设计模式系列】观察者模式

一、什么是观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被称为发布-订阅模式,其中对象(主题)维护一个依赖于它的观察者列表,并且在其状态变化时通知它们。

二、观察者模式的角色

  1. Subject(主题)

    • 也被称为Observable,它是观察者模式的核心。主题包含观察者列表,并为观察者提供注册(订阅)、注销(取消订阅)和通知的方法。
    • 它有两种形式:抽象主题和具体主题。抽象主题提供一个接口,定义了管理观察者的方法,而具体主题实现了这个接口,并在状态变化时通知所有观察者。
  2. Observer(观察者)

    • 观察者定义了一个更新接口,该接口在被观察者状态变化时会被调用。这个接口通常包含一个update()方法,它接收一个参数,该参数通常是主题对象的引用。
  3. ConcreteSubject(具体主题)

    • 具体主题是主题的一个实现,它包含状态信息,并且在状态变化时负责通知所有注册的观察者。
  4. ConcreteObserver(具体观察者)

    • 具体观察者实现了观察者接口,并在update()方法中定义了接收到通知后的具体逻辑。

三、观察者模式的典型应用场景

  1. 事件处理系统:许多编程框架和库使用观察者模式来实现事件处理机制,允许对象在状态变化时通知其他对象。

  2. 缓存系统:缓存数据时,如果底层数据发生变化,缓存系统需要通知依赖这些数据的应用或服务。

  3. 配置管理和服务发现:在微服务架构中,服务的注册和发现机制常常使用观察者模式,以确保服务的变化能够及时通知到其他服务。

四、观察者模式在Observer中的应用

在Java中,Observer类和Observable类是观察者模式的典型实现,它们提供了一种实现对象间一对多依赖关系的方式。以下是Observer类和Observable类在观察者模式中的应用:

  1. Observable类

    • Observable类充当抽象主题(Subject)的角色,它维护了一个观察者(Observer)对象的列表,并且提供了方法来添加(addObserver)、删除(deleteObserver)观察者以及通知(notifyObservers)所有观察者。
  2. Observer接口

    • Observer接口定义了观察者必须实现的update方法,该方法将在被观察对象(Observable对象)的状态发生改变时被调用。
import java.util.Observable;
import java.util.Observer;// 具体观察者
class ConcreteObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println("Observer received update: " + arg);}
}// 具体主题
class ConcreteObservable extends Observable {private int counter;public void increment() {counter++;setChanged(); // 标记状态改变notifyObservers(counter); // 通知观察者}
}public class ObserverPatternDemo {public static void main(String[] args) {ConcreteObservable observable = new ConcreteObservable();ConcreteObserver observer = new ConcreteObserver();observable.addObserver(observer); // 注册观察者// 模拟状态变更observable.increment();observable.increment();}
}

在这个示例中,ConcreteObservable类继承了Observable类,表示被观察的主题,它有一个increment方法来模拟状态的变更。每次调用increment方法时,都会通知所有注册的观察者(ConcreteObserver实例)。观察者通过实现Observer接口的update方法来接收更新。

观察者模式在Java中的应用非常广泛,特别是在需要实现动态通知和更新的场景中。通过使用Observable类和Observer接口,开发者可以轻松地实现这一模式,从而提高代码的模块化和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/455802.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AscendC算子开发】笔记2 算子高级开发和调试调优

算子调试 Tensor也可以通过特定的printf方法来打印,见上图。 gdb调试见上图。 为什么gdb调试无法成功,因为run.sh里面有两行export,如果直接通过.XX运行的话需要配置一下。 npu域也支持调试,可以使用上述的方法。 内存检测工…

AI自动生成PPT哪个软件好?智能生成PPT不再熬夜做课件

大概这世上,都是职场牛马对“PPT”这三个字母的头痛反应最大吧! 是的,就连各个年级段的老师也是很头痛——愁着怎样能在排版整齐的情况下,将必考知识点都呈现在PPT每一张幻灯片页面里...... 近期打听到用人工智能生成ppt课件&am…

ProtoBuf 的含义和安装

ProtoBuf 是什么 Protocol Buffers 是 Google 的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤ 于(数据)通信协议、数据存储等。 Protocol Buffers 类⽐于、 XML,是⼀种灵活,⾼效,⾃动化机…

Java项目-基于springboot框架的智慧外贸系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

2024年最新苹果iOS证书申请创建App详细图文流程

iOS 证书设置指南: 对于开发者来说,在没有Mac电脑或对Xcode等开发工具不熟悉的情况下,如何快速完成IOS证书制作和IPA文件提交至开发者中心一直是一个难题。但是现在,有了初雪云提供的极简工具,您可以轻松实现这两个任…

Tomcat隐藏版本号和报错信息

为了避免漏洞扫描的时候造成版本泄露&#xff0c;可以在conf/server.xml配置文件中的<Host>配置项中添加如下配置: <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" /> …

c语言内核链表

c语言内核链表 在Linux中拥有大量的内核源码&#xff0c;在数据存储的这块位置拥有内核链表&#xff08;双向循环链表&#xff09; 由linux内核提供的链表文件&#xff0c;里面包含了多组内联函数和宏定义函数以及功能性函数。 内核链表中定义了多个函数&#xff0c;我们只需要…

(gersemi) CMake 格式化工具

文章目录 &#x1f9ee;介绍&#x1f9ee;安装&#x1f9ee;使用&#x1f5f3;️模式 modes&#x1f5f3;️样式配置 config ⭐END&#x1f31f;help&#x1f31f;交流方式 &#x1f9ee;介绍 BlankSpruce/gersemi: A formatter to make your CMake code the real treasure A f…

关闭或开启Win11系统的自动更新

Win11系统老是自动更新&#xff0c;每次更新后不仅拖慢计算机的运行速度&#xff0c;甚至打印机都无法使用了&#xff0c;给我们带来了很多困扰。 那么我们该如何彻底关闭Win11系统的自动更新呢&#xff1f;关闭Win11系统自动更新会有什么弊端呢&#xff1f; 下面就分享几个小方…

NVIDIA 发布适用于网络安全的 NIM Blueprint

德勤使用适用于容器安全的 NVIDIA NIM Agent Blueprint 帮助企业利用开源软件构建安全的 AI。 文章目录 &#x1f64a; 德勤使用 NVIDIA AI 保障软件安全&#x1f64a; 通过生成式 AI 保障软件安全&#x1f64a; 适用于网络安全成功的蓝图&#x1f3a0; 什么是 NVIDIA NIM Agen…

ESP32移植Openharmony外设篇(3)OLED屏

模块简介 产品介绍 OLED (Organic Light-Emitting Diode)&#xff1a;有机发光二极管又称为有机电激光显示&#xff0c;OLED显示技术具有自发光的特性&#xff0c;采用薄的有机材料涂层和玻璃基板&#xff0c;当有电流通过时&#xff0c;这些有机材料就会发光&#xff0c;而且…

数组中的算法

目录 1.什么是数组 2.数组上的算法 2.1二分查找算法 什么是二分查找算法&#xff1f; 算法步骤 算法时间复杂度 一个问题 例题 题目分析 解题代码 2.2双指针法 什么是双指针法&#xff1f; 例题 题目分析 解题代码 1.什么是数组 数组是在一块连续的内存空间…

【vuejs】富文本框输入的字符串按规则解析填充表单

今天遇到一个批量添加信息的需求&#xff0c;按照格式要求解析后填充到表单中&#xff0c;不符合规则的直接过滤掉 注&#xff1a;添加的信息都是随机生成&#xff0c;不用于实际用途 这是弹框输入的文本解析代码 export const editValToArr (value, bankArr) > {return n…

vue2-render:vue2项目使用render / 基础使用

一、本文内容 本文内容记录render常用的一些属性和方法的配置&#xff0c;以作参考 export default { data() {return { modelValue: ,key: 0,}; }, render(h) { return h(div, [ h(input, {class: input,attrs: { type: text }, key: this.key,props: { value: thi…

【mysql进阶】2-4. mysql 系统库

mysql System Schema (mysql系统库) Mysql Schema是⼀个系统库&#xff0c;表中存储了MySQL服务器运⾏时所需的信息。⼴义上&#xff0c;mysqlschema包含存储数据库对象元数据的数据字典和⽤于其他操作⽬的的系统表。数据字典表和系统表位于数据⽬录下⼀个名为 mysql.ibd 的表…

“声音”音源设置和音效播放

学习如何使用音效系统&#xff0c;背景音乐和其他特别的音效&#xff0c;跳跃攻击等等 学习如何在unity当中使用整套的音效系统&#xff0c;使用之前&#xff0c;我们先来确定一下我们要使用的音乐和音效&#xff0c;在Unity Asset Store当中搜索&#xff0c;添加到我们的unit…

详解Oracle审计(二)

题记&#xff1a; 本文将承接上篇详细介绍oracle的审计功能&#xff0c;基于11g版本&#xff0c;但对12c&#xff0c;19c也同样适用。 1. 语句审计实操演示实例 sqlplus / as sysdba show parameter audit_trail alter system set audit_traildb_extended scopespfile; star…

OpenCV和HALCON

OpenCV和HALCON是两种广泛用于图像处理和计算机视觉的开发库&#xff0c;它们各有优缺点&#xff0c;适合不同的应用场景。以下是两者的比较&#xff1a; 1. 开发背景与定位 OpenCV (Open Source Computer Vision Library)&#xff1a; 开源库&#xff0c;最初由Intel开发&…

Gitlab 完全卸载–亲测可行

1、停止gitlab gitlab-ctl stop2.卸载gitlab&#xff08;注意这里写的是gitlab-ce&#xff09; rpm -e gitlab-ce 3、查看gitlab进程 ps aux | grep gitlab 4、杀掉第一个进程&#xff08;就是带有好多.............的进程&#xff09; 5、删除所有包含gitlab文件 find / …

【计网】深入理解网络通信:端口号、Socket编程及编程接口

目录 1.端口号 1.1.理解源 IP 地址和目的 IP 地址 1.2.认识端口号 1.3.端口号范围划分 1.4理解 "端口号" 和 "进程 ID" 2.socket编程 2.1.理解 socket 2.2.socket编程的概念 2.3. 传输层的典型代表 认识 TCP 协议 认识 UDP 协议 2.3 网络字节序…