Java设计模式之观察者模式

【Java设计模式】Java设计模式之(九)观察者模式(Observer Pattern) 观察者模式属于行为型模式。 当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。 观察者一般可以看做是第三者,举例说明: (1)比如在学校上自习的时候,大家肯定都有过交头接耳、各种玩耍的经历,这时总会有一个“放风”的小伙伴,当老师即将出现时及时“通知”大家老师来了。 (2)比如,拍卖会的时候,大家相互叫价,拍卖师会观察最高标价,然后通知给其它竞价者竞价,这就是一个观察者模式。 (3)对于观察者模式而言,肯定有观察者和被观察者 阅读详情

观察者模式:有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式),是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
现在用《headfirst设计模式》书上的例子理解一下

1.定义主题接口:所有的主题必须实现此接口,前两个方法需要传入一个观察者对象作为参数,实现注册和删除观察者。最后一个方法用来在主题状态改变时通知所有的观察者。

public interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObservers();
}

2.定义观察者接口:所有观察者必须实现此接口,实现update()方法,这里将观测值传入观察者中,当气象观测值改变时,主题会把这些状态值当作此方法的参数,传给观察者。实现display()方法将其按照自己的方式输出在控制台。

public interface Observer {
    public void update(float temperature,float humidity,float pressure);
    public void display();
}

3.具体主题:实现主题接口,并重写方法,添加自己的方法。

import java.util.ArrayList;

public class WeatherDate implements Subject {

    //这里用ArrayList来记录观察者,将其在构造器中建立
    private ArrayList observers;

    //定义WeatherDate主题的相关内容变量
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherDate() {
        observers=new ArrayList();
    }

    //重写注册、删除和通知方法
    @Override
    public void registerObserver(Observer o) {
        observers.add(o);

    }
    //
    @Override
    public void removeObserver(Observer o) {
        int i=observers.indexOf(o);
        if(i>=0){
            observers.remove(i);
        }

    }

    @Override
    public void notifyObservers() {
        for(int i=0;i<observers.size();i++){
            Observer observer=(Observer) observers.get(i);
            observer.update(temperature, humidity, pressure);
        }

    }

    //当得到新的观测值时调用通知方法
    public void measurementsChanged(){
        notifyObservers();
    }
    public void setMessurements(float temperature,float humidity,float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();

    }


}

4.具体观察者
第一个具体观察者:实现观察者接口,重写方法。只输出展现温度和湿度

public class CurrentConditionDisplayOne implements Observer {

    private float temperature;
    private float humidity;
    private Subject weatherDate;


    public CurrentConditionDisplayOne(Subject weatherDate) {
        this.weatherDate = weatherDate;
        weatherDate.registerObserver(this);
    }

    @Override
    public void display() {
        System.out.println("Current condition One:"+temperature+"F degrees"+" "+humidity+"%humidity");

    }

    @Override
    public void update(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        display();

    }

}

第二个具体观察者:实现观察者接口,重写方法。只输出展现压力和湿度。

public class CurrentConditionDisplayTwo implements Observer {

    private float pressure;
    private float humidity;
    private Subject weatherDate;


    public CurrentConditionDisplayTwo(Subject weatherDate) {
        this.weatherDate = weatherDate;
        weatherDate.registerObserver(this);
    }

    @Override
    public void display() {
        System.out.println("Current condition Two:"+pressure+"N"+" "+humidity+"%humidity");

    }

    @Override
    public void update(float temperature, float humidity, float pressure) {
        this.pressure = pressure;
        this.humidity = humidity;
        display();

    }

}

第三个对象,,,

测试类:

public class WeatherStation {
    public static void main(String[] args) {
        WeatherDate weatherDate=new WeatherDate();
        CurrentConditionDisplayOne currentConditionDisplayOne=
                new CurrentConditionDisplayOne(weatherDate);
        CurrentConditionDisplayTwo currentConditionDisplayTwo=
                new CurrentConditionDisplayTwo(weatherDate);
        weatherDate.setMessurements(80, 65, 30.4f);
        System.out.println("-------------");
        weatherDate.removeObserver(currentConditionDisplayTwo);
        weatherDate.setMessurements(70, 15, 25.3f);
    }
}

控制台输出:

Current condition One:80.0F degrees 65.0%humidity
Current condition Two:30.4N 65.0%humidity
-------------
Current condition One:70.0F degrees 15.0%humidity

观察者模式,在对象之间定义一对多的依赖,这样一来当主题对象改变时,依赖它的所有观察者对象都会收到通知并自动更新。

观察者模式的应用场景:
1、 对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。
2、 对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。
观察者模式的优点:
1、 Subject和Observer之间是松偶合的,分别可以各自独立改变。
2、 Subject在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否要订阅Subject的通知。
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。
观察者模式的缺陷:
1、 松偶合导致代码关系不明显,有时可能难以理解。(废话)
2、 如果一个Subject被大量Observer订阅的话,在广播通知的时候可能会有效率问题。(毕竟只是简单的遍历)
引用链接:http://www.cnblogs.com/justinw/archive/2007/05/02/734522.html

APM32F103 配置CAN 摘要: 本文介绍了基于APM32F103RCT6的CAN通信实现,包含GPIO初始化、CAN配置、数据收发功能。通过配置CAN1的GPIO引脚(PB8/PB9)和波特率(500Kbps),实现标准帧格式的数据传输。发送函数支持8字节数据包,接收函数通过FIFO0处理消息,并根据接收ID触发响应发送(如ID 0x1回复0x2)。代码还包含错误状态检测(如总线关闭处理)和过滤器配置(32位掩码模式)。整体实现了基础的CAN通信与错误管理功能。 阅读详情

相关推荐

Globus数据下载全攻略:从零配置到批量下载大文件(附常见问题解决)

本文详细介绍了Globus数据下载的全流程,从零配置到批量下载大文件的实用技巧,包括环境准备、高级传输策略、性能优化及常见问题解决方案。Globus作为科研数据的高效传输工具,通过并行流传输和自动校验技术,显著提升大规模数据传输的效率和可靠性。

u9v0w的博客 663

折腾Java设计模式之观察者模式

观察者模式 Define a one-to-many dependency between objects where a state change in one object results in all its dependents being notified and updated automatically. 直译过来就是,定义对象间的一对多依赖关系,当一个对象的状态变更会自动通知和更...

weixin_33755847的博客 190

MATLAB不能识别已安装的visual studio 2015解决方法

首先,对于MATLAB识别已经安装的vs版本通过命令: mex -setup 下图为本电脑下同时安装的两个visual studio 如果搞清楚MATLAB识别电脑上安装vs的过程,可通过命令: mex -setup -v MATLAB输出识别编译器的整个过程。其中HKLM和HKCU分别是注册表中的HKEY_CURRENT_USER,HKEY_LOCAL_MA…的缩写,MATLAB没有找到对应编译器是由于注册表里没有对应信息(主要是文件路径,C++编译器的路径),或者在注册表里存在该信息,但是找不到

qq_36320710的博客 4900

java 观察者模式类图_Java 设计模式之观察者模式

摘要:本篇主要讲Java设计模式之观察者模式。[TOC]​ 当心浮气躁时,告诫自己要静下心来,一步一步来,不要急不要燥。​ 观察者模式也叫做发布订阅模式,是一种行为型设计模式。观察者模式最常用的地方是GUI系统、订阅---------发布系统。尤其是GUI系统,使用观察者模式可以使UI层与业务逻辑解耦。​ 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态。则所有依赖于它的对象都会得到通知并...

weixin_33309848的博客 329

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响

本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。

weixin_29230901的博客 228

ros2 humble cartographer 2D激光雷达建图

Cartographer是一个支持多平台和传感器配置的SLAM的系统。 本文主要讲述在ros2 humble系统上cartographer的安装方法,以及如何配置参数实现自己的ros2 bag包的离线建图。

weixin_43087302的博客 6939

Java设计模式—观察者模式

(尊重劳动成果,转载请注明出处:https://blog.youkuaiyun.com/qq_25827845/article/details/52414289冷血之心的博客) 目录 观察者模式(Observer Pattern) 定义如下: 个人理解: 通用类图: 包含角色: ● Subject 被观察者 ● Observer 观察者 ● Concrete Subject 具体的被观察者 ...

冷血之心的博客 3697

开源3D激光SLAM算法的异同点、优劣势与适配场景总结

本文对比分析了主流开源3D激光SLAM方案的核心差异与适用场景。LOAM架构简洁但精度较低;LeGO-LOAM轻量化适合地面机器人;LIO-SAM采用因子图优化支持多传感器融合;LVI-SAM通过视觉-激光-惯性三重冗余提升鲁棒性;FAST-LIO系列基于滤波架构实现超高实时性。选型需权衡传感器配置(纯激光/激光+IMU/激光+视觉)、运动状态(高速/常规)、计算资源等因素:资源受限选LeGO-LOAM或Faster-LIO,高速运动选FAST-LIO系列,退化环境选LVI-SAM,全局一致性需求选LIO-

Studying…… 651

观察者模式——java实现

一、题目要求 某高校教学管理系统需要实现如下功能,如果某个系的系名发生改变,则该系所有教师和学生的所属系名称也将发生改变。使用Java语言提供的观察者类和观察目标类实现该功能,绘制类图并编程实现。 二、观察者模式分析 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低...

桥边菇凉的博客 2847

MTK Android 12 Clone Project 克隆项目

本文介绍了如何使用MTK Android 12 Clone Project 克隆一个新的项目。通过使用绝对路径执行Perl脚本,并根据需要选择升级或降级位数,可以成功地生成一个新的项目并进行编译。希望本文对xdm有所帮助。

我其实什么都不会 943

Android SELinux——neverallow问题处理(十六)

遇到 neverallow 规则问题,千万别急着去注释/剔除里面原有的规则(原生的尽量别动)。增加 allow 规则是常见的解决办法,但是随着 android 版本的升级,系统对 SELinux 的管控越来越严,增加了大量的 neverallow。一般情况下,向默认标签授予权限的做法是错误的,其中许多权限都是 neverallow 规则所不允许的。按照上面方法去添加 SELinux 可能会违反了 neverallow 规则,编译时候会报 neverallow 相关的错误。

小旭的专栏 2691

如何使用 Java8 实现观察者模式?

【编者按】本文作者是 BAE 系统公司的软件工程师 Justin Albano。在本篇文章中,作者通过在 Java8 环境下实现观察者模式的实例,进一步介绍了什么是观察者模式、专业化及其命名规则,供大家参考学习。观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式,是四人组(GoF,即 Erich Gamma、Richard Helm、Ralph Johnson ...

zhong930的博客 2128

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Java - 【设计模式】观察者模式(Observer Pattern)

设计模式 - 观察者模式(Observer Pattern) -> 解决问题:一个对象的状态发生改变,如何通知其他对象? 被观察对象(Subject) 观察对象(Observer) -> 注意: 互相指定,互相包含! 一:被观察对象(Subject) 1> 维护一个可变对象,该对象变化对应一个方法,该方法内部需要通知所有观察者(notifyAllObservers) private int state; public void setState(int state) {

⚡ 579

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java 设计模式——观察者模式(Observer Pattern)

    前言 一、简介 二、实现步骤 (1)实现方式: (2)举例: (3)步骤简化版: 三、代码实现 四、总结 五、Demo地址 六、参考文档 七、内容推荐 前言 本来没想写前言的,感觉就是一堆废话。那就当废话浏览一下吧,只是提醒一下自己一些注意的东西。 在许多博客当中看到把观察者模式又称呼为发布-订阅模式。其实我感觉两者确实很相似,但还是有一丢丢的区别: 在...

斌林诚上的博客 727

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java设计模式-观察者模式(Observer Pattern)

观察者模式是软件设计模式中常见的一种,是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

IT熊的专栏 495

详解Java设计模式之观察者模式(Observer Pattern)

观察者模式又叫做发布-订阅(Publish/Subscribe)模式,模型-视图( Model/View)模式、源-监听器( Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。

Elegance never goes out of fashion 3629

JAVA设计模式之 观察者模式【Observer Pattern】

一、概念:   简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。

小吕丶Code阶区 2088

Java设计模式之观察者模式(Observer Pattern)

介绍 观察者模式是一种行为型设计模式,也叫做发布订阅模式(Publish/subcribe)。当一个对象发生改变时,多个对象需要得到通知,这个时候就需要利用观察者模式来实现。先看一下它的定义: Define a one-to-many dependency between objects so that when one object changes state, all its d...

落队的飞行兵 420

Java常用设计模式--观察者模式(Observer Pattern)

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 四个角色 Subject:抽象被观察者,把所有观察者对象的引用保存到集合中,然后 提供添加,移除,和通知观察者对象更新的方法。 ConcreteSubject:被观察者,集合存放观察者,重写增删和通知观察者 的方法,当发生变化时通知观...

gang_luo的博客 399

Java设计模式--观察者模式【Observer Pattern】

自二胎政策放开后,越来越多的家庭将拥有两个宝宝。而大部分家庭都希望有儿有女,儿女齐全,这样的家庭无疑是幸福美满的。可是,许多家庭也由于无人照看孩子,而选择放弃生二胎。家庭条件的限制,给爸爸妈妈们留下了终生的遗憾。今天,我们就拿“照看”宝宝的例子,来切入到观察者模式的主题。   宝宝出生后,身边需要大人照顾。有些家庭只有宝宝的妈妈照顾,而有的家庭爷爷奶奶,外公外婆,七大姑八大姨都加入了照顾宝宝的行

CoderLover 463

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

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

季鸢的博客 1298

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

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

Fatter$hday的博客 1715

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

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

杨荧的优快云博客 1万+

Java设计模式之观察者模式(Observer Pattern)

Observer Pattern 是一种常用的设计模式,它是一种事件监听模型,

停止更新 4481
上一篇: Java设计模式之策略模式
下一篇: JSP学习笔记之一
詹詹自喜KING
博客等级 码龄11年 40粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值