news 2026/7/15 4:05:02

Java设计模式超详解--观察者设计模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java设计模式超详解--观察者设计模式

目录

一,看图初步理解

二,题目

题目分析:

三,总结


一,看图初步理解

如果是刚开始接触到设计模式的朋友,可能会疑惑

观察者是个什么意思(・∀・(・∀・(・∀・*),要观察什么

举个例子:

有一本非常著名的杂志,有很多忠实的读者都等着它的更新

这里的读者我们就说他们是观察者(ConcreteObserver)

杂志的更新对读者们来说尤其重要,需要有人能够及时通知他们杂志的情况

所以我们需要一个工具,能够协助杂志社进行通知读者的工作

这里我们就引入了具体目标(ConcreteSubject)

它的作用如下
1.统计读者数量与信息,便于后续通知到他们

2.更新后通知读者

为了方便管理,这里还引入了

Observer接口:方便实现对所有读者的统一管理

Subject抽象类:实现对通知行为的统一管理

通过这种方式,就实现了针对观察者通知的完整流程

接下来通过一个题目加深大家的理解

二,题目

如下代码 Subject 和 Observer 分别是观察者设计模式中的主题接口和观察者接口,

GameScore实现主题接口,记录篮球比赛的比分,其中gameTime数据域表示比赛进行的时间,

homeScore数据域表示主队得分,visitorScore数据域表示客队得分。

ScoreDB是其中一个观察者,将得分情况记录进入数据库

VoiceScore是其中一个观察者,语音播报得分

DisplayScore 是其中一个观察者,大屏显示得分

请将 GameScore 类补充完整并提交(只需提交GameScore 类)

import java.util.*; interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyObserver(); } interface Observer { public void update(String gameTime,int homeScore,int visitorScore); }

/**补充完整GameScore 类并提交**/

class ScoreDB implements Observer{ @Override public void update(String gameTime, int homeScore, int visitorScore) { System.out.println(String.format("%s:%d-%dwriteToDB",gameTime,homeScore,visitorScore)); } } class VoiceScore implements Observer{ @Override public void update(String gameTime, int homeScore, int visitorScore) { System.out.println(String.format("%s:%d-%dvoice",gameTime,homeScore,visitorScore)); } } class DisplayScore implements Observer{ @Override public void update(String gameTime, int homeScore, int visitorScore) { System.out.println(String.format("%s:%d-%dscreenDisplay",gameTime,homeScore,visitorScore)); } } public class Main { public static void main(String[] args){ GameScore gameScore=new GameScore(); ScoreDB scoreDB=new ScoreDB(); VoiceScore voiceScore=new VoiceScore(); DisplayScore displayScore=new DisplayScore(); gameScore.registerObserver(scoreDB); gameScore.registerObserver(voiceScore); gameScore.registerObserver(displayScore); gameScore.setScore("Game10minute",1,0); gameScore.removeObserver(voiceScore); gameScore.setScore("Game19minute",1,1); } }

输出描述

Game10minute:1-0writeToDB

Game10minute:1-0voice

Game10minute:1-0screenDisplay

Game19minute:1-1writeToDB

Game19minute:1-1screenDisplay

题目分析:

根据题目已经给出的代码以及题目要求,我们来理一下该题目的逻辑

观察者(ConcreteObserver)是谁

ScoreDB是其中一个观察者,将得分情况记录进入数据库

VoiceScore是其中一个观察者,语音播报得分

DisplayScore 是其中一个观察者,大屏显示得分
题目已经明确告诉我们

现在让我们分析一下观察者的代码

class ScoreDB implements Observer{ @Override public void update(String gameTime, int homeScore, int visitorScore) { System.out.println(String.format("%s:%d-%dwriteToDB",gameTime,homeScore,visitorScore)); } }

只有一个函数,等待具体目标(ConcreteSubject)将更新后的内容传输给他得到结果

那谁又是具体目标(ConcreteSubject)

我们发现题目中已经给出的类分别对应观察者(ConcreteObserver)/Observer接口/Subject接口

因此需要我们补充的GameScore 类显而易见就是我们需要的具体目标(ConcreteSubject)

画出类图

因此GameScore 类需要实现2部分工作

1.增加观察者

2.通知观察者使之更新

再结合题目已经给出的Subject接口

我们实现代码如下

class GameScore implements Subject{ private List<Observer> Observers = new ArrayList<>(); private String gameTime;//比赛进行时间 private int homeScore;//主队得分 private int visitorScore;//客队得分 public void setScore(String gameTime,int homeScore,int visitorScore){ this.gameTime=gameTime; this.homeScore=homeScore; this.visitorScore=visitorScore; notifyObserver(); } public void registerObserver(Observer o){//增加观察者 Observers.add(o); } public void removeObserver(Observer o){//移除观察者 Observers.remove(o); } public void notifyObserver(){//挨个通知观察者 for(Observer o:Observers){ o.update(this.gameTime, this.homeScore, this.visitorScore); } } }

三,总结

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

设计模式系列持续更新,欢迎关注博主~

希望对大家有用,祝您开心~(o゜▽゜)o☆,有问题欢迎交流,俺会改的✊

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 16:06:40

量子级AI评估新纪元:MCP AI-102必须关注的6项稀缺性性能指标

第一章&#xff1a;MCP AI-102量子模型评估的范式跃迁 传统模型评估依赖静态指标如准确率与F1分数&#xff0c;难以捕捉量子增强AI系统的动态行为。MCP AI-102标志着评估范式的根本性转变——从经典统计验证转向基于量子态可重构性的多维动态分析。 评估维度的扩展 现代评估体…

作者头像 李华
网站建设 2026/7/13 20:37:10

喷砂除锈设备安全操作规程是什么?| 广东鑫百通喷砂机厂家

喷砂除锈设备作业涉及高压、粉尘与高速粒子冲击&#xff0c;严格遵守安全操作规程是保障人员安全、确保作业质量、延长设备寿命的根本前提。 本规程涵盖核心安全要求&#xff0c;作业人员必须培训合格后方可上岗。&#xff08;仅供参考&#xff09; 一、喷砂除锈设备个人安全防…

作者头像 李华
网站建设 2026/7/15 7:33:03

VSCode卡顿拖慢量子算法研发?立即升级这8项配置

第一章&#xff1a;VSCode卡顿对量子算法研发的影响在量子计算领域&#xff0c;开发环境的稳定性与响应速度直接影响算法设计与调试效率。VSCode作为主流集成开发环境&#xff0c;广泛用于编写Q#、Python&#xff08;配合Qiskit、Cirq等框架&#xff09;实现的量子算法。然而&a…

作者头像 李华
网站建设 2026/7/15 16:02:52

构建数字孪生流域数据底座:qData 数据中台 + qThing 物联网平台 助力某省水利厅实现全域感知一体化

从“碎片感知”到“一图统览”&#xff0c;从“人工搬运”到“自动流转”——某河流域数字孪生建设的底层突破在国家大力推进数字孪生流域建设的背景下&#xff0c;某省水利厅率先启动 某河流域数字孪生试点工程&#xff0c;旨在构建“天空地水工”一体化的智能感知与决策体系。…

作者头像 李华
网站建设 2026/7/15 5:19:18

Wan2.2-Animate-14B:简单上手的角色动画生成终极指南

Wan2.2-Animate-14B&#xff1a;简单上手的角色动画生成终极指南 【免费下载链接】Wan2.2-Animate-14B 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-Animate-14B 在数字内容创作领域&#xff0c;制作专业级角色动画曾是技术门槛极高的任务。Wan2.2-Ani…

作者头像 李华
网站建设 2026/7/14 4:45:40

如何让Q#程序自动输出API文档?VSCode配置秘籍首次公开

第一章&#xff1a;Q#程序的VSCode文档生成概述 在量子计算开发中&#xff0c;Q# 作为一种专为量子算法设计的高级编程语言&#xff0c;依赖于良好的开发工具链支持。Visual Studio Code&#xff08;VSCode&#xff09;作为主流编辑器之一&#xff0c;通过扩展插件提供了对 Q# …

作者头像 李华