Java与设计模式(2)--观察者模式

观察者模式Java实现与设计模式详解 观察者模式是一种经典的行为型设计模式,核心用于实现对象间的一对多依赖关系。当一个对象(称为主题或Subject)的状态发生变化时,所有依赖于它的对象(称为观察者或Observer)都会自动收到通知并作出响应。该模式广泛应用于事件驱动系统中,如图形用户界面(GUI)的事件监听机制、数据模型与视图的同步更新、消息通知系统等。其主要角色包括:Subject(主题):维护观察者列表,提供注册与移除观察者的接口,并在状态变化时通知所有观察者。Observer(观察者) 阅读详情

Observer模式是行为模式之一,它的作用是当一个对象(我们称之为主题,Subject)的状态发生变化时,能够自动通知其他关联对象(我们称之为观察者,Observer)。通常情况下一个主题可以对应一个以上的观察者。实际中经常用在我们的事件模型中,例如AWT事件、Swing事件等等。


Observer模式的角色:

  • Subject(主题,被观察者):被观察的对象。当主题的状态发生变化时,需要通知队列中所有观察者对象,因此Subject需要维持(添加,删除,通知)一个观察者对象的队列列表,这个列表中维护一个所有观察者对象,并在发生变化时通知他们。
  • ConcreteSubject:被观察者的具体实现。包含一些基本的属性状态及其他操作。
  • Observer(观察者):接口或抽象类。当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知。
  • ConcreteObserver:观察者的具体实现。得到通知后将完成一些具体的业务逻辑处理。

JDK提供了对observer设计模式的支持:

  • java.util.Observable类扮演Subject角色,一个类只需通过继承java.util.Observable类便可担当ConcreteSubject角色;
  • java.util.Observer接口扮演Observer角色,一个类只需实现java.util.Observer接口便可担当ConcreteObserver角色。
  • java.util.Observable的实现类通过调用setChanged()方法以及notifyObservers(Object)方法便可简单地通知Observer。

下面是一个简单的例子:

Subject已经被实现为Observable类,且Observer已经被实现为Observer接口,所以我们只需要实现ConcreteSubject和ConcreteObserver即可:

ConcreteSubject:

public class ConcreteSubject extends Observable {
	public String str;

	public void setStr(String str) {
		this.str = str;
		// 属性发生变更,需要设置change属性并通知所有的Observer对象
		setChanged();
		notifyObservers(str);
	}

}

ConcreteObserver:

public class ConcreteObserver implements Observer {
	@Override
	public void update(Observable o, Object arg) {
		// 被ConcreteSubject对象通知需要刷新
		System.out.println("Parameter is " + (String)arg);
	}

}

测试类:

public class ConsoleTest {
	public static void main(String[] args) {
		ConcreteSubject subject = new ConcreteSubject();
		
		ConcreteObserver obj1 = new ConcreteObserver();
		ConcreteObserver obj2 = new ConcreteObserver();
		ConcreteObserver obj3 = new ConcreteObserver();
		
		subject.addObserver(obj1);
		subject.addObserver(obj2);
		subject.addObserver(obj3);
		subject.setStr("Hello");
	}

}


我们再去看看源代码:

Subject的源代码:去掉注释后我们可以发现主要就是实现了add、delete、notify这几个主要的方法,这样我们普通的开发者就无需自己去实现这些,只要调用setChanged和notify即可。


package java.util;

public class Observable {
    private boolean changed = false;
    private Vector obs;

    public Observable() {
        obs = new Vector();
    }

    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }

 
    public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }

 
    public void notifyObservers() {
        notifyObservers(null);
    }

    public void notifyObservers(Object arg) {
        /*
         * a temporary array buffer, used as a snapshot of the state of
         * current Observers.
         */
        Object[] arrLocal;

        synchronized (this) {
            /* We don't want the Observer doing callbacks into
             * arbitrary code while holding its own Monitor.
             * The code where we extract each Observable from
             * the Vector and store the state of the Observer
             * needs synchronization, but notifying observers
             * does not (should not).  The worst result of any
             * potential race-condition here is that:
             * 1) a newly-added Observer will miss a
             *   notification in progress
             * 2) a recently unregistered Observer will be
             *   wrongly notified when it doesn't care
             */
            if (!changed)
                return;
            arrLocal = obs.toArray();
            clearChanged();
        }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }

    public synchronized void deleteObservers() {
        obs.removeAllElements();
    }

    protected synchronized void setChanged() {
        changed = true;
    }

    protected synchronized void clearChanged() {
        changed = false;
    }

  
    public synchronized boolean hasChanged() {
        return changed;
    }

    public synchronized int countObservers() {
        return obs.size();
    }
}


Observer代码更加简单:仅仅是一个接口,因为我们每个开发者需要实现不同的刷新方式。


package java.util;

public interface Observer {
    /**
     * This method is called whenever the observed object is changed. An
     * application calls an <tt>Observable</tt> object's
     * <code>notifyObservers</code> method to have all the object's
     * observers notified of the change.
     *
     * @param   o     the observable object.
     * @param   arg   an argument passed to the <code>notifyObservers</code>
     *                 method.
     */
    void update(Observable o, Object arg);
}

这样看下来整个Observer设计模式就没有那么神秘了。
从0死磕全栈之使用 VS Code 调试 Next.js 应用完整指南 调试目标推荐方式客户端组件VS Code + Chrome 调试器(pwa-chrome中间件(Middleware)同服务端方式静态生成(SSG)逻辑需在next build时调试,建议改用dynamic路由临时测试通过合理配置 VS Code 调试器,你可以像调试普通 Node.js 或前端项目一样,高效排查 Next.js 应用中的各类问题。🐞。 阅读详情

相关推荐

西门子工业物联网云平台 Insights Hub 技术白皮书

Insights Hub是西门子公司推出的工业物联网云平台,它是一个使用开放技术的基于云架构的平台,能够为制造业企业提供物联网连接、数据分析、应用开发等一系列服务。Insights Hub的设计理念是“连接、分析和运营”,即通过连接物理设备、收集数据并进行分析,来优化工业生产的运营和管理。

可爱的刘三岁的博客 3334

java observer模式_Java观察者模式(Observer)详解及应用

Java观察者模式(Observer)详解及应用(2011-12-15 14:03:30)标签:杂谈Java观察者模式(Observer)详解及应用由于网站带有弱sns功能,因此需要设计关注和被关注的消息或是动作通知,那么将这个需求抽象出来的时候就会发现正好符合java中订阅者模式,我还是喜欢叫观察着模式,具体网站的实现代码就不写了,写一个简单的例子大家了解下即可一、概述Java的设计模式很多,观...

weixin_30581253的博客 1414

抖音小游戏上架避坑指南:从软著申请到ICP备案全流程解析

本文详细解析了抖音小游戏上架前必须完成的软著申请和ICP备案全流程,提供了清晰的时间线规划与实操避坑指南。文章重点阐述了个人与企业备案的区别、材料准备要点以及平台审核常见问题,旨在帮助独立开发者和小团队高效、合规地完成游戏上架,避免在行政流程中延误项目。

weixin_29276847的博客 1557

java自带观察者模式,一个简易的java自带的观察者模式实现

public class Observable {private boolean changed = false;private Vector obs;/** Construct an Observable with zero Observers. */public Observable() {obs = new Vector();}/*** 将一个观察者添加到观察者聚集上面*/public sy...

weixin_29248653的博客 210

蓝凌EIS智慧协同平台frm_form_upload.aspx接口存在任意文件上传漏洞

蓝凌EIS智慧协同平台frm_form_upload.aspx接口存在任意文件上传漏洞

nnn2188185的博客 357

华为OD机试双机位C卷-简单的解压缩算法(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【简单的解压缩算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD真题【简单的解压缩算法】。

qq_45776114的博客 475

GOF23设计模式之观察者模式的理解与实现2(使用java自带的观察者类和接口)

观察者模式的理解与实现,使用JDK自带的Observer类和Observable接口

不当初 1071

RK3588高速接口实战-PCIE

摘要: RK3588的PCIe接口支持PCIe 3.0x4和PCIe 2.1x1/x2,具备Root Complex和Endpoint模式,适用于NVMe SSD、5G模块等高速设备。硬件设计需注意85Ω/100Ω阻抗匹配、220nF AC耦合电容及100MHz参考时钟。设备树需配置控制器节点、PHY模式和IOMMU映射(RC模式用iommu-map,EP模式用iommus)。调试时可通过lspci检查链路状态,dmesg查看训练日志,perf分析性能。常见问题包括设备识别失败(检查复位时序、PHY配置)、

weiyvyy的博客 503

Java面试题中的设计模式图解:Wan2.2-I2V-A14B辅助理解

本文介绍了如何通过星图GPU平台自动化部署Wan2.2-I2V-A14B私有部署镜像(RTX4090D 24G CUDA12.4优化版),实现设计模式的可视化辅助学习。该镜像能将抽象的Java设计模式转化为直观的生活场景图像,如用快餐店比喻工厂模式、新闻订阅展示观察者模式,帮助开发者快速理解并记忆核心概念,提升面试准备效率。

weixin_36212459的博客 278

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

【Dify(v1.x) 核心源码深入解析】File 模块

文件模型(File Model)定义了文件的核心属性,如文件类型、传输方法、相关标识符等,是整个文件处理流程的数据基础。文件解析器(UploadFileParser)负责解析上传的文件,根据配置决定以何种方式(URL 或 Base64)提供图像数据。工具文件解析器(ToolFileParser)专注于工具文件的管理,提供工具文件管理器的获取接口。签名验证与生成(helpers.py)包含文件 URL 签名的生成与验证逻辑,确保文件访问的安全性。文件管理器(file_manager.py)

668

Wan2.2-T2V-A5B助力Java面试:动态演示经典算法与设计模式

本文介绍了如何利用星图GPU平台,一键自动化部署“🐎 乙巳马年 · 皇城大门春联生成终端W”镜像,快速搭建AI内容创作环境。该镜像的核心应用场景是文生视频,能够将文本描述(如算法步骤或设计模式原理)自动转化为动态演示视频,为技术面试与知识讲解提供直观的可视化辅助工具。

weixin_31597759的博客 139

2025MCM美赛 数学建模 问题 C:奥运奖牌榜模型 思路+matlab代码+python代码

目录问题一详细思路步骤1. 数据准备与预处理2. 特征选择与构建3. 模型选择4. 模型训练与评估5. 预测与不确定性分析6. 分析与结果解释步骤详细代码实现python代码代码解析matlab代码问题二详细思路解决方案步骤1. 构建生产模型:2. 优化决策:3. 代码实现:代码解析matlab代码问题三的详细思路解决思路:代码实现1. 数据准备2. 代码实现matlab代码在这个问题中,我们的目标是根据历史奥运会的数据,建立一个模型来预测2028年洛杉矶奥运会各国的奖牌数。具体要求是:首先,整理并加载奥运

斌擎科技 2144

Java常用设计模式——观察者模式

一、行为描述 观察者会观察特定对象的状态变化,一旦状态有所变化或产生特定条件,被观察对象会通知给观察者, 而观察者则会依据通知信息采取特定处理措施。 举个例子,公司接到了一个大项目,各个部门都在观察项目的进度,一旦洽谈成功,项目正式进入启动阶段, 那么设计部就会出图纸,开发部就会出流程、出架构,售前部就会跑现场实地勘测… 项目就是被观察者,而各个部门就是观察者。 二、角色关系 观察者模式就两种角色——观察者和被观察者。 观察者对象往往会规范结构,一般是继承一个抽象观察者。 I. 抽象观察者会定义3个重要

Morty的技术乐园 345

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java设计模式之一:观察者模式

Java设计模式之一:观察者模式

杨荧的优快云博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java设计模式之观察者模式详解

在软件开发中,我们常常会遇到这样的场景:当一个对象的状态发生变化时,需要自动通知其他相关对象。这种场景下,观察者模式就派上了用场。观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。接下来,我们将深入探讨Java中的观察者模式,并结合图文和代码示例进行详细讲解。

季鸢的博客 1298

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

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

java与设计模式-观察者模式

java与设计模式-观察者模式 一、定义 观察者模式(Observer Pattern) 也叫做发布订阅模式(Publish/subscribe) ,它是一个在项 目中经常使用的模式, 其定义如下: Define a one-to-many dependency between objects so that when one object changes state,all its depend...

瘦子没有夏天 2494

Java设计模式-行为型设计模式-观察者模式

Java设计模式-行为型设计模式-观察者模式

Fatter$hday的博客 1715

设计模式之观察者模式ObserverPattern(十一)

观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

徐泗空的博客 1047

【Java 设计模式】行为型之观察者模式

观察者模式是一种行为型设计模式,用于定义一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。观察者模式通常包含两个主要角色:主题(Subject)和观察者(Observer)。维护一组观察者对象,提供添加、删除和通知观察者的方法。主题可以是具体的实现类或接口。定义了一个更新方法,用于在主题状态发生变化时接收通知和执行相应操作。观察者通常是一个接口,可以由具体的实现类来实现。观察者模式是一种用于定义对象间一对多的依赖关系的设计模式。

好久不见的流星 1257

java设计模式学习之【观察者模式】

这篇教程不仅提供了观察者模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1825

2024050701-重学 Java 设计模式《实战观察者模式》

简单来讲观察者🕵模式,就是当一个行为发生时传递信息给另外一个用户接收做出相应的处理,两者之间没有直接的耦合关联。例如;狙击手、李云龙。除了生活中的场景外,在我们编程开发中也会常用到一些观察者的模式或者组件,例如我们经常使用的MQ服务,虽然MQ服务是有一个通知中心并不是每一个类服务进行通知,但整体上也可以算作是观察者模式的思路设计。再比如可能有做过的一些类似事件监听总线,让主线服务与其他辅线业务服务分离,为了使系统降低耦合和增强扩展性,也会使用观察者模式进行处理。

qq_24428851的博客 1212

Java设计模式之观察者模式

Java设计模式之观察者模式 观察者模式介绍      观察者模式是我们项目中使用率非常高的一种设计模式,它最常用的地方就是GUI系统、订阅——发不系统,因为这个模式的一个重要的作用就是解耦,将被观察者和观察者解耦,使得他们之间的依赖性更小,甚至做到毫无依赖。 观察者模式的定义      定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖与它的对象都会得到通知并被自动更新

GodV的博客 755

Java设计模式【观察者模式】-行为型

观察者模式(Observer Pattern)是一种行为型设计模式,定义了一种一对多的依赖关系,使得一个对象状态的改变可以自动通知并更新依赖于它的多个对象。观察者模式的关键在于,将对象之间的耦合度降低,使得一个对象的变化不会直接影响其他对象,但可以通过通知机制间接影响它们。主体(Subject):也称为被观察者,它维护一组观察者并负责通知它们状态的变化。观察者(Observer):注册到主体上,当主体的状态发生变化时,观察者会被通知。

lianyinghhh的博客 2015

Java 设计模式——观察者模式:从 4 种写法到 SpringBoot 进阶

本文介绍了观察者模式在Java中的4种实现方式,重点推荐SpringBoot环境下的两种主流写法:1)通过接口注入自动装配观察者,实现业务解耦,支持执行顺序控制;2)利用Spring事件机制实现更灵活的事件发布/监听,支持异步和事务边界控制。文章还分析了传统JDK实现和Guava事件总线的优缺点,并针对复杂场景给出设计建议,帮助开发者根据不同需求选择最佳实现方案,实现业务模块间的松耦合通信。

qq_46601365的博客 1198

设计模式之观察者模式

设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。( 引用维基百科 )观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。

smart_an的专栏 1191
上一篇: Java与设计模式(04)--单例模式
下一篇: Node.js先睹为快(1)
Soloman
博客等级 码龄25年 171粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值