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

一、什么是观察者模式

观察者模式(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.mzph.cn/pingmian/57554.shtml

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

相关文章

「重磅」中国电信数据湖+数据中台实施方案(附60页方案)

来源:公众号-数据分析小兵 作者按 哈喽,大家好,我是数据分析小兵,今天小兵向大家分享中国电信基于数据湖的数据中台实施方案。 方案核心内容一:数据湖的搭建与实施 数据湖是一套针对海量多源异构数据,具备数据采集、数据存储、数据计算、数据访问、数据管理的技术架构…

代码随想录:206. 反转链表

206. 反转链表 创建头结点,使用头插法,并用新的结点保存值插入里面。 空间复杂度O(n2) /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val…

1.CentOS安装

CentOS安装 新建虚拟机 选择安装方式 指定镜像方式 选择操作系统类型 设置虚拟机名称和位置 指定磁盘大小 点击“自定义硬件” 指定内存大小 指定镜像位置 点击“开启此虚拟机” 选择“Install CentOS 7”并回车 选择语言 选择安装“GNOME桌面”环境 配置安装位置 配置网络和…

springboot高校科研项目和课题管理平台-计算机毕业设计源码18198

摘要 随着科技的快速发展和高校科研水平的持续提高,科研项目和课题的管理逐渐变得复杂多样。传统的管理方式,如使用纸质文档或简单的电子表格进行记录,已经无法满足现代高校科研管理的需求。这不仅影响了科研工作的效率,还可能导致…

boost 字符串

5.1. 前言 在标准 C 中,用于处理字符串的是 std::string 类,它提供很多字符串操作,包括查找指定字符或子串的函数。 尽管 std::string 囊括了百余函数,是标准 C 中最为臃肿的类之一,然而却并不能满足很多开发者在日常…

CentOS 7(Linux)详细安装教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、CentOS镜像的下载(准备工作) 我选择的是其他镜像源的下载地址: Index of /centos-vault/7.6.1810/isos/x86_64/ | 南阳理工学院开源镜…

8个方法教会你提高企业培训效率

培训成本是企业中的一个复杂问题。它完全取决于课程内容、培训方法以及成本效益。在计算培训费用时,公司会面临许多关于包括哪些内容、如何进行以及假设情景的问题。 企业员工培训的每个方面都会产生自己的成本。例如: 地点:我们专门找个培训…

冒泡排序(Python)

冒泡排序:依次比较相邻的两个数,将大数放在后面,小数放在前面。 n个数排序共需进行n-1趟,第一趟排序结束时,最后一个元素为所有元素中的最大值。 冒泡排序的原理 1)比较相邻元素:如果第一个比…

Python异步编程:使用`asyncio`和`aiofiles`进行高效的文件批量写入

Python异步编程:使用asyncio和aiofiles进行高效的文件批量写入 1. 异步编程基础1.1 asyncio和await1.2 aiofiles 2. 异步文件批量写入示例2.1 代码结构2.2 代码实现2.3 代码解释2.3.1 BatchWriter类2.3.2 main函数 3. 其他示例代码3.1 简单的异步文件写入3.2 异步文…

婚纱相册必须去摄影店吗?其实自己会拍照就能实现,性价比更高

一直以来,婚纱照都是新人们婚礼筹备中不可或缺的部分。然而,高昂的摄影店价格让不少新人望而却步。其实,只要掌握一些拍照技巧,自己在家就能制作出独一无二的婚纱相册,不仅性价比超高,还能留下更多珍贵的回…

Android 中的串口开发

一:背景 本文着重讲安卓下的串口。 由于开源的Android在各种智能设备上的使用越来越多,如车载系统等。在我们的认识中,Android OS的物理接口一般只有usb host接口和耳机接口,但其实安卓支持各种各样的工业接口,如HDM…

条码检测系统——基于MATLAB的一维条码识别

摘 要:条码技术是如今应用最广泛的识别和输入技术之一,由于其包含的信息量大,识别错误率低而在各个方面得到很大的重视。它发展迅速并被广泛应用于于工业、商业、图书出版、医疗卫生等各行各业。由我国目前发展现状来看,条码的正…

人工智能:重塑未来生活与工作的科技力量

方向一:介绍人工智能技术的发展历程和现状,指出它的应用领域和前景 一、人工智能技术的发展历程 人工智能(Artificial Intelligence, AI)作为一门学科,其起源可以追溯到20世纪50年代。最初,AI的研究主要集…

Mytatis-plus使用sl4j日志打印SQL

以下是关于使用 Spring Boot 起始器替换 slf4j-api 和 logback 依赖的详细步骤和注意事项&#xff0c;包括 MyBatis-Plus 的默认日志级别信息。 1、依赖项配置 在 pom.xml 中添加以下依赖项&#xff1a; <dependency><groupId>org.springframework.boot</gro…

字符串使用方法:

字符串: -- 拼接字符串 SELECT CONCAT(糯米,啊啊啊撒,删掉); -- 字符长度 SELECT LENGTH(asssssssggg); -- 转大写 SELECT UPPER(asdf); -- 转小写 SELECT LOWER(ASDFG); -- 去除左边空格 SELECT LTRIM( aaaasdrf ); -- 去除右边空格 SELECT RTRIM( aaaasdff ); -- 去除两端…

攻坚金融关键业务系统,OceanBase亮相2024金融科技大会

10月15-16日&#xff0c;第六届中新数字金融应用博览会与2024金融科技大会&#xff08;简称“金博会”&#xff09;在苏州工业园区联合举办。此次大会融合了国家级重要金融科技资源——“中国金融科技大会”&#xff0c;围绕“赋能金融高质量发展&#xff0c;金融科技创新前行”…

【C++指南】运算符重载详解

引言 C 提供了运算符重载这一特性&#xff0c;允许程序员为自定义类型&#xff08;如类和结构体&#xff09;定义运算符的行为。 通过运算符重载&#xff0c;可以使自定义类型对象像内置类型一样使用运算符&#xff0c;从而提高代码的可读性和易用性。 本文将详细介绍 C 中运算…

【状态机DP】力扣2786. 访问数组中的位置使分数最大

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。 你 一开始 在数组的位置 0 处&#xff0c;你可以按照下述规则访问数组中的其他位置&#xff1a; 如果你当前在位置 i &#xff0c;那么你可以移动到满足 i < j 的 任意 位置 j 。 对于你访问的位置 i &#xff0c…

若依微服务15 - RuoYi-Vue3 实现前端独立运行

正文开始&#xff1a; RuoYi-Vue3 使用 Vue3 Element Plus Vite 技术栈。 GitHub 开源地址&#xff1a;https://github.com/yangzongzhuan/RuoYi-Vue3 本文介绍使用若依提供的在线后端接口&#xff0c;仅启动前端项目并进行界面开发&#xff0c;而无需启动后端服务。 一、克隆…

AI视听新体验!浙大阿里提出视频到音乐生成模型MuVi:可解决语义对齐和节奏同步问题

MuVi旨在解决视频到音乐生成(V2M)中的语义对齐和节奏同步问题。 MuVi通过专门设计的视觉适配器分析视频内容,以提取上下文 和时间相关的特征,这些特征用于生成与视频的情感、主题及其节奏和节拍相匹配的音乐。MuVi在音频质量和时间同步方面表现优于现有基线方法,并展示了其在风…