Java面试题:解释观察者模式的工作原理,并通过实例展示如何在Java中实现

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并自动更新。这种模式常用于事件处理系统,如GUI事件处理、订阅-发布系统等。

工作原理

  1. 主题(Subject):主题对象持有一组观察者,并提供注册、删除观察者的方法。当主题对象状态改变时,调用通知方法,通知所有观察者。
  2. 观察者(Observer):定义一个更新接口,以便主题状态发生变化时更新自己。
  3. 具体主题(Concrete Subject):具体主题实现了主题接口,负责在状态改变时通知所有注册的观察者。
  4. 具体观察者(Concrete Observer):具体观察者实现了观察者接口,负责在接到通知时更新自身。

Java 实现

步骤1:定义观察者接口

public interface Observer {void update(String message);
}

步骤2:定义主题接口

import java.util.ArrayList;
import java.util.List;public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}

步骤3:实现具体主题

public class ConcreteSubject implements Subject {private List<Observer> observers;private String message;public ConcreteSubject() {this.observers = new ArrayList<>();}@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(message);}}public void setMessage(String message) {this.message = message;notifyObservers();}
}

步骤4:实现具体观察者

public class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received message: " + message);}
}

步骤5:测试观察者模式

public class ObserverPatternDemo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver("Observer 1");Observer observer2 = new ConcreteObserver("Observer 2");subject.registerObserver(observer1);subject.registerObserver(observer2);subject.setMessage("Hello, Observers!");subject.setMessage("Observer Pattern in action!");subject.removeObserver(observer1);subject.setMessage("Observer 1 has been removed");}
}

结果输出

Observer 1 received message: Hello, Observers!
Observer 2 received message: Hello, Observers!
Observer 1 received message: Observer Pattern in action!
Observer 2 received message: Observer Pattern in action!
Observer 2 received message: Observer 1 has been removed

在这个示例中,我们创建了一个具体主题ConcreteSubject和两个具体观察者ConcreteObserver。当主题的状态发生变化时,所有的观察者都会收到通知并更新自己的状态。这展示了观察者模式如何工作以及如何在Java中实现。

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

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

相关文章

Linux[高级管理]——Squid代理服务器的部署和应用(传统模式详解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f468;‍&#x1f4bb;Linux高级管理专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月24日11点11分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— Squid功能 Squ…

LabelEncoder 类属性类方法及用法

类 LabelEncoder类属性及类方法示例用法用于大型数据集 类 LabelEncoder LabelEncoder 是 scikit-learn 中的一个预处理工具&#xff0c;用于将类别变量&#xff08;例如字符串标签或离散的整数标签&#xff09;转换为整数。 类 LabelEncoder 在包 sklearn.preprocessing.Lab…

【JavaEE精炼宝库】多线程进阶(1)常见锁策略 | CAS | ABA问题

目录 一、常见的锁策略&#xff1a; 1.1 悲观锁 | 乐观锁&#xff1a; 1.2 重量级锁 | 轻量级锁&#xff1a; 1.3 自旋锁 | 挂起等待锁&#xff1a; 1.4 公平锁 | 非公平锁&#xff1a; 1.5 可重入锁 | 不可重入锁&#xff1a; 1.6 互斥锁 | 读写锁&#xff1a; 1.7 面…

Spring Boot 集成 MinIO 实现文件上传

Spring Boot 集成 MinIO 实现文件上传 一、 Minio 服务准备 MinIO的搭建过程参考 Docker 搭建 MinIO 对象存储。 登录MinIO控制台&#xff0c;新建一个 Bucket&#xff0c;修改 Bucket 权限为公开。 二、MinIO 集成 添加 MinIO 依赖 <!-- https://mvnrepository.com/ar…

【工具测评】ONLYOFFICE——你的下一款桌面编辑器

文章目录 前言一、安装1.1 跳转官网下载安装包1.2 安装步骤 二、功能介绍2.1 功能全面的 PDF 编辑器2.2 PDF 表单2.3 文本文档编辑器的更新2.4 电子表格编辑器的更新2.5 演示文稿编辑器有哪些更新2.6 所有编辑器中的改进内容2.7 从右至左显示 & 新的本地化选项2.8 可用性提…

查找一个有向网络的头节点和尾节点 (70%用例)C卷(JavaPythonC++Node.jsC语言)

给定一个有向图,图中可能包含有环,有向边用两个节点表示。第一个整数表示起始节点,第二个整数表示终止节点,如0 1表示存在从0到1的路径。每个节点用正整数表示,求这个数据的头节点与尾节点,题目给的用例会是一个头节点,但可能存在多个尾节点。同时,图中可能含有环,如果…

重生奇迹MU整理装备技巧

除了注意一些基本的事项外&#xff0c;还有一些技巧可以帮助我们更快更好地整理装备&#xff0c;提升自己在游戏中的表现。 1. 理性地管理装备是取得胜利的关键。在整理装备时&#xff0c;根据不同的属性和需求&#xff0c;可以将装备分类&#xff0c;比如攻击型、防御型、辅助…

CRMEB 多门店后台登录入口地址修改(默认admin)

一、>2.4版本 1、修改后端 config/admin.php 配置文件,为自定义的后缀 2、修改 平台后台前端源码中 view/admin/src/settings.js 文件,修改为和上面一样的配置 3、修改后重新打包前端代码,并且覆盖到后端的 public 目录下&#xff1a;打包方法 4、重启swoole 二、<2.4版…

深度神经网络中的“深度”概念解析

引言 深度神经网络&#xff08;Deep Neural Networks, DNNs&#xff09;是机器学习领域的一大突破&#xff0c;它们在图像识别、自然语言处理、游戏等领域取得了革命性的进展。DNNs的核心特性之一就是其“深度”&#xff0c;这通常指的是网络中层的数量。本文将深入探讨深度神…

云函数-uniapp + uniCloud 订阅消息实战教程(二)

一、创建uniCloud项目 在 HBuilderX 新建项目界面&#xff0c;选择 uni-app项目&#xff0c;输入项目名称&#xff0c;选择默认模板即可&#xff0c;根据个人需要选择 vue版本&#xff0c;并勾选 启用uniCloud&#xff0c;在右侧选择服务供应商&#xff08;支付宝云、阿里云、…

人机交互中的“测不准原理”

谈及人机交互中的“测不准原理”时&#xff0c;我们所指的并非物理学中量子力学的测不准原理&#xff0c;而是一种借用该概念来描述在人机交互领域中出现的不确定性和不可预测性现象。这种不确定性主要表现在以下几个方面&#xff1a; 用户在与系统交互时的行为和反应可能是难以…

Spring Cloud:构建高可用、分布式系统的现代架构

Spring Cloud是一个开源的微服务框架&#xff0c;旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具&#xff0c;用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的…

再不挖掘就晚了!本周三分之二二区以上 | GBD数据库周报(6.12~6.18)

全球疾病负担&#xff08;GBD&#xff09;是迄今为止规模最大、最全面的一项研究&#xff0c;旨在量化不同地区和不同时期的健康损失&#xff0c;从而改善卫生系统并消除差异。 该研究由华盛顿大学健康指标与评估研究所 (IHME) 牵头&#xff0c;是一项真正的全球性研究&#xf…

Tensorflow入门实战 T06-Vgg16 明星识别

目录 1、前言 2、 完整代码 3、运行过程结果 4、遇到的问题 5、小结 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 1、前言 这周主要是使用VGG16模型&#xff0c;完成明星照片识别。 2、 完整代…

解决uni-popup禁止滚动穿透

解决uni-popup禁止滚动穿透 uni-popup弹窗内内容有滚轮会带动外部页面滚动 在弹框内容页面中修改样式 .list {overflow: auto;height: calc(100% - 280rpx);overscroll-behavior: none;}overscroll-behavior: none; 表示禁止滚动溢出 发现移动遮罩层底部也会跟着变动 则在全…

奇点临近:人类与智能时代的未来

在信息爆炸的时代&#xff0c;我们每天都被海量的信息所淹没&#xff0c;如何才能在这个嘈杂的世界中找到真正有价值的信息&#xff1f;如何才能利用信息的力量&#xff0c;提升我们的认知水平&#xff0c;重塑我们的未来&#xff1f; 这些问题的答案&#xff0c;或许都能在雷…

无需高配置 怎么获得超流畅的VR体验?

传统VR眼镜在使用中存在一些显著不足&#xff0c;而实时渲染技术又是如何解决的&#xff1f;接下来与大家共同探讨遇到的问题以及实时渲染在VR眼镜中的实际应用。 1、高配置要求 目前主流VR一体机的眼镜需要较高配置才能运行普通VR内容&#xff0c;且受限于VR眼镜的算力限制&…

【小程序】聊天功能

文章目录 聊天功能实现功能实现思路后端前端效果展示 聊天功能 实现功能 要实现一个聊天机器人&#xff0c;它能够解答用户疑问&#xff0c;并且能够识别到用户聊天的主题&#xff0c;涉及到饮食方面时&#xff0c;会自动决定是否要去数据库中读取用户的相关喜好信息&#xf…

【ARM】MDK自动备份源文件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决MDK在编写文档的时候需要找回上一版代码的问题。 2、 问题场景 目前大部分情况下对于源代码的管理都是使用的Git等第三方的代码管理平台。这样的第三方代码管理平台都是针对与代码的版本更新进行管理。对于本地…

2024年6月上半月30篇大语言模型的论文推荐

大语言模型&#xff08;LLMs&#xff09;在近年来取得了快速发展。本文总结了2024年6月上半月发布的一些最重要的LLM论文&#xff0c;可以让你及时了解最新进展。 LLM进展与基准测试 1、WildBench: Benchmarking LLMs with Challenging Tasks from Real Users in the Wild Wi…