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设计模式就没有那么神秘了。
光学系统仿真软件:OSLO_(13).衍射光学元件设计v1 目标函数是设计DOE的关键步骤之一。目标函数可以是一个具体的光强分布,也可以是一个特定的波前形状。在仿真软件中,目标函数通常用数学表达式或数据文件来定义。假设我们需要设计一个二元相位掩模,使其在特定位置生成三个焦点。我们可以定义一个目标函数来描述这三个焦点的光强分布。# 定义目标函数"""定义一个多焦点目标函数:param x: 横坐标:param y: 纵坐标:param z1: 第一个焦点的深度:param z2: 第二个焦点的深度:param z3: 第三个焦点的深度。 阅读详情

相关推荐

玩转Matlab-Simscape(初级)-01-从一个简单模型开始学习之旅

本文从初学者的角度分享的关于Matlab simscape 的基础内容,简单分享了Simscape搭建模型,创建子系统,修改定义参数等内容,为将来深入学习和使用simscape做铺垫。

万金油笑匠的博客 6517

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

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

weixin_30581253的博客 1414

WPT无线电能传输公式推导、编程计算、仿真验证全过程

主要分为5大模块,分别为无补偿,SS,SP,PP,PS,每个模块对应有公式推导,matlab编程计算相关参数以及将计算参数和仿真验证观察是否对应。采用matlab编程计算参数以及simulink仿真验证

zzhao2580的博客 7755

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

3D视觉引导技术在机器人焊接中的应用

通过对比传统的2D视觉和3D视觉技术在焊接领域的应用差异,探讨了3D视觉引导技术在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势。本文对3D视觉引导技术在机器人焊接中的应用进行了深入探讨,总结了其在提高焊接精度、适应不规则工件形状和增强自适应能力方面的优势,并通过应用案例展示了其在焊接路径规划、焊缝检测和焊接质量控制等方面的重要作用。1. 提高焊接精度:3D视觉引导技术能够精确测量焊接工件的三维形状和位置,为机器人提供精准的焊接路径规划和跟踪,从而提高焊接精度。三、3D视觉引导技术概述。

2302_79273122的博客 1835

Linux平台CCS安装配置完整示例

手把手讲解在Linux系统中完成CCS安装与环境配置的全过程,涵盖关键步骤与常见问题解决,是查找ccs安装教程时不可多得的实战指南。

weixin_42601134的博客 514

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

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

不当初 1071

TVS 管击穿电压与钳位电压的工程解析

TVS二极管的核心参数击穿电压(VBR)和钳位电压(VC)常被混淆,但二者具有本质区别。VBR是

硬核科技 477

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

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

weixin_36212459的博客 278

【Unity引擎技术整合】 Unity学习路线 | 知识汇总 | 持续更新 | 保持乐趣 | 共同成长

本文对Unity引擎的知识进行了一个整理总结,基本包含了Unity中大部分的知识介绍。 网上也有很多Unity相关的学习资料,但大多数都不成体系,学起来的时候难免会东奔西走的摸不着头脑。 本文整理的多数文章都是有对应的系列性文章专栏,可以更方便的进行系统学习相关知识体系。

努力前行,总会成为自己心中的那道光 15万+

快速入门必看!RT-DETR手把手训练自己的数据集去跑实验,基于 ultralytics 仓库源码改进,配置虚拟环境,准备数据集、训练、验证、推理测试 ,实现0到1的完整教学过程。

本文介绍了使用Ultralytics框架训练RT-DETR模型的全流程。首先需要创建Python 3.10虚拟环境,安装指定版本的PyTorch和相关依赖包。然后准备数据集,修改配置文件,并详细介绍训练、验证和推理三个核心步骤的代码实现。训练阶段使用RTDETR类加载模型配置,设置训练参数;验证阶段评估模型性能;推理阶段可对图片、视频等进行预测。文中还提供了清华大学镜像源加速下载,以及详细的参数配置说明,帮助用户快速搭建RT-DETR目标检测模型。

Ai缝合怪、助力小伙伴高效发论文 5551

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

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

weixin_31597759的博客 139

【全网首发】2026华为OD双机位C卷 机考真题题库含考点说明以及在线OJ (Java)

如果你收到的是双机位C卷考试通知,需要针对性地调整备考策略。自2025年11月19日起,华为OD机试已正式从双机位A卷切换至。复杂度明显提升,需要组合多个算法点。题面相对简单,直接考查编程基本功。考查问题分析、算法选择和优化能力。通常为1-2个核心算法点的应用。

算法大师! 168

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

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

Morty的技术乐园 345

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

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

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

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

杨荧的优快云博客 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

季鸢的博客 1298

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、付费专栏及课程。

余额充值