设计模式之观察者模式(下)

3)JDK对观察者模式的支持
1.概述

在JDK的java.util包中,提供了Observable类以及Observer接口,它们构成了JDK对观察者模式的支持。

在这里插入图片描述

2.Observer接口

在java.util.Observer接口中只声明一个方法,它充当抽象观察者。

void  update(Observable o, Object arg);

当观察目标的状态发生变化时,该方法将会被调用,在Observer的子类中将实现update()方法,即具体观察者可以根据需要具有不同的更新行为,当调用观察目标类Observable的notifyObservers()方法时,将执行观察者类中的update()方法。

3.Observable类

java.util.Observable类充当观察目标类,在Observable中定义了一个向量Vector来存储观察者对象。

在这里插入图片描述

4.代码实现
// 具体目标类
import java.util.Observable;

public class ConcreteSubject extends Observable {
    private String label;

    public ConcreteSubject(String label) {
        this.label = label;
    }

    public void change(){
        System.out.println(this.label+"目标行为发生改变");
        setChanged();
    }
}

// 具体观察者类
import java.util.Observable;
import java.util.Observer;

public class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("接收到更新=>"+this.name);
    }
}

// 客户端类
import java.util.Observer;

public class Client {
    public static void main(String[] args) {
        ConcreteSubject center = new ConcreteSubject("center");

        Observer observerA = new ConcreteObserver("A");
        Observer observerB = new ConcreteObserver("B");
        Observer observerC = new ConcreteObserver("C");

        center.addObserver(observerA);
        center.addObserver(observerB);
        center.addObserver(observerC);

        System.out.println(center.countObservers());
        System.out.println(center.hasChanged());

        center.change();
        System.out.println(center.hasChanged());
        center.notifyObservers();
    }
}
5.注意

使用Observer接口和Observable类来作为观察者模式的抽象层,再自定义具体观察者类和具体观察目标类,使用JDK中的Observer接口和Observable类,可以方便地在Java语言中应用观察者模式。

4)总结
1.优点

观察者模式的主要优点如下:

  • 观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。

  • 观察者模式在观察目标和观察者之间建立一个抽象的耦合,观察目标只需要维持一个抽象观察者的集合,无须了解其具体观察者。

  • 观察者模式支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化了一对多系统设计的难度。

  • 观察者模式增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便。

2.缺点
  • 如果一个观察目标对象有很多直接和间接观察者,将所有的观察者都通知到会花费很多时间。

  • 如果在观察者和观察目标之间存在循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

3.适用场景
  • 一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用。

  • 一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁。

  • 需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab软件使用教学

1. Matlab简介 Matlab(Matrix Laboratory的缩写)是一种由MathWorks公司开发的数值计算和可视化编程环境。它广泛应用于工程、科学研究、数学和教育等领域,因其强大的计算能力和丰富的工具箱而受到青睐。 2. 安装与启动 安装:从M…

05_Qt资源文件添加

Qt资源文件添加 Qt 资源系统是一个跨平台的资源机制,用于将程序运行时所需要的资源以二进制的形式存储于可执行文件内部。如果你的程序需要加载特定的资源(图标、文本翻译等),那么,将其放置在资源文件中,就…

【电控笔记5.7】Notch-Filter滤波器

Notch-Filter滤波器 通过阻尼比,限制陡峭程度 阻尼比小,比较陡峭,对周围信号干扰比较小,衰减度小 总结 实现:转换成Z转换进行伯德图验证

5款小伙伴们私信推荐免费软件

​ 最近后台收到好多小伙伴的私信,今天继续推荐五款小工具,都是免费使用的,大家可以去试试看。 1. 数据恢复工具——EaseUS Data ​ EaseUS Data是一款高效的数据恢复软件,能够恢复因各种原因丢失的文件,如误删除、格…

成都多家终端门店反馈:飞天茅台价格已回升至良性稳定区间

成都多家终端门店反馈:飞天茅台价格已回升至良性稳定区间 原创 尼 奥 长江酒道 2024-04-20 16:36 四川 执笔 | 尼 奥 编辑 | 古利特 “价值决定价格,价格围绕价值上下波动。” 进入4月份白酒传统销售淡季,飞天茅台的价格波动成为行业关注…

IOTOS物联中台衔接通信连接驱动和协议报文驱动,实现多个设备实例复用同一个TCP端口,以modbus rtu协议tcp透传方式采集数据

网站:UIOTOS前端零代码 原型即应用!支持页面嵌套、属性继承、节点编辑,真正实现页面即组件,支持无代码开发复杂的前端界面应用。 从前面驱动实例可以看出,设备连接通信和报文解析通常是在一个驱动里,这种方…

gitee / github 配置git, 实现免密码登录

文章目录 怎么配置公钥和私钥验证配置成功问题 怎么配置公钥和私钥 以下内容参考自 github ssh 配置,gitee的配置也是一样的; 粘贴以下文本,将示例中使用的电子邮件替换为 GitHub 电子邮件地址。 ssh-keygen -t ed25519 -C "your_emai…

模板(二)

文章目录 模板(二)1 非类型模板参数2. 模板的特化2.1. 概念2.2 函数模板特化2.3 类模板特化2.3.1 全特化2.3.2 偏特化2.3.3 类模板特化应用示例 3 模板的分离编译3.1 什么是分离编译3.2 模板的分离编译3.3 解决方法 4. 模板总结 模板(二&…

调试 WebSocket API 技巧分享

WebSocket 是一种在单个 TCP 连接上实现全双工通信的先进 API 技术。与传统的 HTTP 请求相比,WebSocket 提供了更低的延迟和更高的通信效率,使其成为在线游戏、实时聊天等应用的理想选择。 开始使用 Apifox 的 WebSocket 功能 首先,在项目界…

成都直播产业园「天府锋巢」电商流量深度变现,助力企业降本增效

天府锋巢园区环境 天府锋巢直播基地 其他重点特色产业服务 等您来解锁! 「锋巢资讯 聚焦天府 诚邀企业 敬请关注」

Flink面试(1)

1.Flink 的并行度的怎么设置的? Flink设置并行度的几种方式 1.代码中设置setParallelism() 全局设置: 1 env.setParallelism(3);  算子设置(部分设置): 1 sum(1).setParallelism(3) 2.客户端CLI设置&#xff0…

C++设计模式:中介者模式(十五)

1、定义与动机 定义:用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各个对象不需要显示的相互引用(编译时依赖 -> 运行时依赖),从而使其耦合松散(管理变化)&#xff…

C#带引导窗体的窗体设计方法:创建特殊窗体

目录 1.设计操作流程 2.实例 (1)Resources.Designer.cs (2)Frm_Main.Designer.cs (3)Frm_Main.cs (4)Frm_Start.Designer.cs (5)Frm_Start.cs &#…

HashData获得华为鲲鹏Validated认证 信创版图持续壮大

近日,经过一系列严格测试评估,酷克数据自研企业级HashData云数仓通过华为鲲鹏高阶调优认证,成功获得鲲鹏Validated技术认证书。 在本次Validated认证过程中,酷克数据携手北京鲲鹏联合创新中心,针对数据仓库的典型应用…

微信小程序实现支付功能——微信jsapi支付

微信小程序jsapi支付的实现涉及多个步骤,主要包括前端请求订单信息、后端处理订单并返回支付参数、前端调用jsapi进行支付等。以下是一个基本的实现流程: 1. 前端请求订单信息 在小程序中,当用户触发支付行为时(例如点击购买按钮…

Vue之v-on事件修饰符的含义及使用

背景:Vue 拆封了一个组件,在组件里面会使用一个方法来改变父组件传过来的值, 但是在子组件里面操作父组件的数据变更,实在比较麻烦(因为单向数据流), So 能不能直接在组件上面绑定事件方法呢&…

vue项目打包时因为图片问题报错

执行 npm run build命令打包项目时报错,看起来是图片的问题: package.json里面image-webpack-loader的版本是^7.0.1 解决方案: 1、先卸载 npm uninstall image-webpack-loader 2、用cnpm重新安装 cnpm install image-webpack-loader --save…

『FPGA通信接口』串行通信接口-IIC(2)EEPROM读写控制器

文章目录 1.EEPROM简介2.AT24C04简介3.逻辑框架设计4.随机读写时序5.仿真代码与仿真结果分析6.注意事项7.效果8.传送门 1.EEPROM简介 EEPROM (Electrically Erasable Programmable read only memory) 是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。在嵌入…

计算机视觉 CV 八股分享 [自用](更新中......)

目录 一、深度学习中解决过拟合方法 二、深度学习中解决欠拟合方法 三、梯度消失和梯度爆炸 解决梯度消失的方法 解决梯度爆炸的方法 四、神经网络权重初始化方法 五、梯度下降法 六、BatchNorm 七、归一化方法 八、卷积 九、池化 十、激活函数 十一、预训练 十二…

【Python-Pygame】

Python-Pygame ■ Pygame-简介■ Pygame-安装■ Pygame-Rect区域位置■ Pygame-Draw绘图函数■ Pygame-■ Pygame-■ Pygame-■ Pygame-事件监听■ Pygame-Event事件模块■ Pygame-游戏循环■ Pygame-Display显示模块■ Pygame-Time时间控制■ Pygame-Font文本和字体■ Pygame-…