Observable设计模式简介

Observable设计模式存在于许多Java API和响应式编程中。下面介绍Java中永恒的Observable模式。  

Observable设计模式用于许多重要的Java API。一个众所周知的示例是使用ActionListenerAPI执行操作的JButton。在这个例子中,我们ActionListener在按钮上进行了监听或观察。单击按钮时,ActionListener将执行操作。

Observable模式也用于响应式编程。在反应式应用程序中使用观察者是有道理的,因为反应式的本质是反应:当另一个进程发生时,事情就会发生。

Observable是一种行为设计模式。它的功能是在事件发生时执行一个动作。两个常见的例子是按钮点击和通知,但这种模式还有更多用途。

一、Observable模式的一个例子

在Observable模式中,一个对象在执行操作时通知另一个对象。为了理解该模式的价值,让我们想象一个需要单击按钮并且没有通知另一个对象的场景,如图1所示。

图片

请注意,ActionCheck必须每秒检查一次按钮。现在,想象一下,如果我们每秒对该按钮进行多次操作检查。您能想象这会对您的应用程序性能产生什么影响吗?

让Do Something按钮通知ActionCheck.这样,ActionCheck逻辑就不需要每秒轮询Do Something按钮。

二、Observable设计模式的元素

在下图中,请注意观察者模式的基础是Observer接口(即观察的对象)和Subject(被观察的对象)。类NewsletterimplementsSubject和Subscriberimplements Observer。最后,SendEmailMain执行Observable设计模式。

图片

三、代码中的Observable模式

Subject接口,也称为Observableor Publisher,是Observable设计模式的基础。基本上,它存储观察者并在观察到的动作发生时立即通知他们。看一下Subject界面。

public interface Subject {void addSubscriber(Observer observer);void removeSubscriber(Observer observer);void notifySubscribers();}

1.观察者界面

接口(Observer有时也称为Subscriber)由订阅者实现,它试图观察是否已执行操作:

public interface Observer {public void update(String email);}

2.行动中可观察

让我们用一个时事通讯的例子来实现这个Subject接口。在下面的代码中,我们存储我们的观察者(在本例中为时事通讯订阅者),并且当他们的电子邮件被添加到订阅时,每个订阅者都会收到通知。

import java.util.ArrayList;
import java.util.List;public class Newsletter implements Subject {protected List<Observer> observers = new ArrayList<>();protected String name;protected String newEmail;public Newsletter(String name) {this.name = name;}public void addNewEmail(String newEmail) {this.newEmail = newEmail;notifySubscribers();}

@Override

public void addSubscriber(Observer observer) {observers.add(observer);}

 @Override

public void removeSubscriber(Observer observer) {observers.remove(observer);}

 @Override

public void notifySubscribers() {observers.forEach(observer -> observer.update(newEmail));}
}

3.订阅者

Subscriber类表示订阅电子邮件时事通讯的用户。此类实现了Observer接口。它是我们将观察的对象,以便我们知道是否发生了事件。

class Subscriber implements Observer {private String name;public Subscriber(String name) {this.name = name;}

 @Override

public void update(String newEmail) {System.out.println("Email for: " + name + " | Content:" + newEmail);}}

4.发送邮件主

现在我们有了使Observable模式有效工作的主类。首先,我们将创建Newsletter对象。然后,我们将添加和删除订阅者。最后,我们将添加一封电子邮件并通知订阅者他们的状态。

public class SendEmailMain {public static void main(String[] args) {Newsletter newsLetter = new Newsletter("Java Challengers");Observer duke = new Subscriber("Duke");Observer juggy = new Subscriber("Juggy");Observer dock = new Subscriber("Moby Dock");newsLetter.addSubscriber(duke);newsLetter.addNewEmail("Lambda Java Challenge");newsLetter.removeSubscriber(duke);newsLetter.addSubscriber(juggy);newsLetter.addSubscriber(dock);newsLetter.addNewEmail("Virtual Threads Java Challenge");}}

这是我们代码的输出:

Email for: Duke | Content:Lambda Java Challenge
Email for: Juggy | Content:Virtual Threads Java Challenge
Email for: Moby Dock | Content:Virtual Threads Java Challenge

五、何时使用Observable模式

当一个动作发生并且需要通知多个对象时,最好使用Observable模式而不是Object多次检查状态。想象一下,有 200多个对象需要接收通知;在这种情况下,您必须将200乘以检查发生的次数。

通过使用Observable模式,通知只会对所有订阅者发生一次。这是一个巨大的性能提升,也是一种有效的代码优化。此代码可以轻松扩展或更改。

反应式编程范式到处都使用Observable模式。如果您曾经使用过Angular,那么您就会知道使用Observable组件非常普遍。响应式组件经常被其他事件和逻辑观察到,当满足特定条件时,组件将执行一些动作。

六、结论

以下是关于Observable设计模式,需要记住的要点:

Observable使用开闭SOLID原则。这意味着我们可以扩展addSubscriber和removeSubscriber方法而无需更改方法名。原因是它接收的是Subject接口而不是直接实现。

Observer界面观察发生在Subject。

Subject也被称为可观察对象,因为它是一个将被观察的主题。它也可以称为发布器,因为它发布事件。

Observer也被称为订阅者,因为它订阅了主题/发布者。操作发生时通知观察者。

如果我们不使用Observable设计模式,订阅者将不得不不断轮询以了解是否发生了事件,这可能会对应用程序性能造成严重影响。Observable是一个更有效的解决方案。


用工具

成功的前端工程师很会善用工具,这些年低代码概念开始流行,像国外的 Mendix,国内的 JNPF,这种新型的开发方式,图形化的拖拉拽配置界面,并兼容了自定义的组件、代码扩展,确实在 B 端后台管理类网站建设中很大程度上的提升了效率。

开源地址:JNPF体验中心

代码量少,系统的稳定性和易调整性都会得到一定的保障。基于代码生成器,可一站式开发多端使用 Web、Android、IOS、微信小程序。代码自动生成后可以下载本地,进行二次开发,有效提高整体开发效率。同时,支持多种云环境部署、本地部署给予最大的安全保障,可以快速搭建适合自身应用场景的产品。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】Flink 详解(二):核心篇 Ⅱ

Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅱ 22、刚才提到 State&#xff0c;那你简单说一下什么是 State。 在 Flink 中&#xff0c;状态 被称作 state&#xff0c;是用来保存中间的计算结果或者缓存数据。根据状态是否需要保存中间结果&#xff0c;分为 无状…

2023年上海国际车展,英信翻译提供中日英同传服务

在2023年4月上海车展期间&#xff0c;日产汽车展示了一系列搭载智能网联技术和电驱动技术的车型&#xff0c;包括首次亮相的Max-Out概念车和专为中国消费者设计的纯电动SUV概念车——日产Arizon。备受全球汽车行业瞩目。 日产是日本第二大汽车公司&#xff0c;也是世界十大汽车…

【JavaSE】接口的语法知识和使用方法总结

目录 1. 接口的概念 2. 语法规则 3. 接口特性 4. 接口使用 5. 实现多个接口 6. 接口间的继承 1. 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的USB口上&#xff0c;可以插&#x…

ML类CFAR检测器在不同环境中检测性能的分析

摘要&#xff1a;该文是楼主翻阅书籍以及一些论文总结出来的关于ML(均值)类CFAR检测器在不同环境中的性能对比&#xff0c;以及优缺点的总结&#xff0c;可以帮助大家面对不同情形如何选择CFAR问题。由于楼主见识短浅&#xff0c;文中难免出现不足之处&#xff0c;望各位指出。…

Linux系统中常见的几种软件包管理器

软件包管理器 DPKGAPT&#xff08;APT-GET&#xff09;RPMYUMDNF Linux软件包管理工具是一组命令的集合&#xff0c;其作用是在操作系统中提供安装、更新、删除及卸载软件的方法&#xff0c;同时提供对系统中所有软件状态信息的查询。不同的Linux发行版会有不同的包管理器&…

浏览器多管闲事之跨域

年少时的梦想就是买一台小霸王游戏机 当时的宣传语就是小霸王其乐无穷~。 大些了&#xff0c;攒够了零花钱&#xff0c;在家长的带领下终于买到了 那一刻我感觉就是最幸福的人 风都是甜的&#xff01; 哪成想... 刚到家就被家长扣下了 “”禁止未成年人玩游戏机 (问过卖家了&a…

接口自动化测试Mock Get和Post请求

Mock可以模拟一个http接口的后台响应&#xff0c;可以模拟request&#xff0c;response 下载 moco-runner-0.11.0-standalone.jar 下载链接: https://pan.baidu.com/s/1bmFzvJPRnDlQ-cmuJ_3iRg 提取码: kpjv 确保安装了jdk,cmd下可以运行java -version 一、模拟不带参的get请求…

【LangChain学习】基于PDF文档构建问答知识库(三)实战整合 LangChain、OpenAI、FAISS等

接下来&#xff0c;我们开始在web框架上整合 LangChain、OpenAI、FAISS等。 一、PDF库 因为项目是基于PDF文档的&#xff0c;所以需要一些操作PDF的库&#xff0c;我们这边使用的是PyPDF2 from PyPDF2 import PdfReader# 获取pdf文件内容 def get_pdf_text(pdf):text "…

Qt 使用QLabel的派生类实现QLabel的双击响应

1 介绍 在QLabel中没有双击等事件响应&#xff0c;需要构建其派生类&#xff0c;自定义信号(signals)、重载事件函数(event)&#xff0c;最后在Qwidget中使用connect链接即可&#xff0c;进而实现响应功能。 对于其余没有需求事件响应的QObject同样适用。 此外&#xff0c;该功…

音视频 FFmpeg命令行搭建

文章目录 一、配置二、测试 一、配置 以FFmpeg4.2.1 win32为例 解压ffmpeg-4.2.1-win32-shared.zip 拷⻉可执⾏⽂件到C:\Windows拷⻉动态链接库到C:\Windows\SysWOW64 注&#xff1a;WoW64 (Windows On Windows64)是⼀个Windows操作系统的⼦系统&#xff0c;被设计⽤来处理许…

【位操作符的几种题型】

位操作符的几种题型 目录 题型一&#xff1a;寻找“单身狗”。 题型二&#xff1a;计算一个数在二进制中1的个数 题型三&#xff1a;不允许创建临时变量&#xff0c;交换两个整数的内容 题型一&#xff1a;寻找“单身狗”。 1.1题目解析 在一个整型数组中&#xff0c;只有…

开发运营监控

DevOps 监控使管理员能够实时了解生产环境中的元素&#xff0c;并有助于确保应用程序平稳运行&#xff0c;同时提供最高的业务价值&#xff0c;对于采用 DevOps 文化和方法的公司来说&#xff0c;这一点至关重要。 什么是开发运营监控 DevOps 通过持续开发、集成、测试、监控…