观察者模式——解决解耦的钥匙

● 观察者模式介绍

        观察者模式是一个使用频率非常高的模式,它最常用的地方是GUI系统、订阅——发布系统。因为这个模式的一个重要作用就是解耦,将被观察者和观察者解耦,使得它们之间依赖性更小,甚至做到毫无依赖。以CUI系统来说,应用的UI具有易变性,尤其是前期随着业务的改变或者产品的需要修改,应用界面也会经常性变化,但是业务逻辑基本变化不大,此时,GUI系统需要一套机制来应对这种情况,使得UI层与具体的业务逻辑解耦,观察者模式此时就派上用场了。

● 观察者模式的定义

        定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并被自动更新。

● 观察者模式的使用场景

        关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系;

        事件对接触发场景;

        跨系统的消息交换场景,如消息队列、事件总线的处理机制。

● 观察者模式的UML类图

        UML类图下图所示。

        

        角色介绍。

        Subject:抽象主题,也就是被观察者(Observable)的角色,抽象主题角色把所有观察者对象的引用在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。

        ConcreteSubject:具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发出通知,具体主题角色又叫做具体被观察者(Concrete Observable)角色。

        Observer:抽象观察者,该角色是观察者的抽象类,它定义了一个更新接口,使得在得到主题的更改通知时更新自己。

        ConcreteObserver:具体的观察者,该角色实现抽象观察者角色所定义的更新接口,以便在主题的状态发生变化时更新自身状态。

● 观察者模式的简单实现

        假设有一个开发技术前线网站,是一个聚合了关于Android、iOS新技术文章的开源库等内容的网站,在这里可以看到新技术、强大的开源库、新的信息,经常浏览这两网站不仅能够开阔眼界,也能让我们接触到前沿的科技信息。

        开发技术前线不仅是个内容发布页面,也支持用户邮箱订阅,每周发布周报后会将优质的内容推送给订阅用户,这种模式叫做发布——订阅模式,它的另一个名称是观察者模式。

        下面让我们来简单模拟一下开发技术前线的发布——订阅过程。

/*** 程序是观察者*/
public class Coder implements Observer {public String name;public Coder(String name) {this.name = name;}@Overridepublic void update(Observable o, Object arg) {System.out.println("Hi, " + name + ", DevTechFrontier更新新, 内容:" + arg);}@NonNull@Overridepublic String toString() {return "码农:" + name;}
}
/*** DevTechFrontier 即开发技术前线,这个网站是被观察者角色,当它有更新时所有的观察者(这里是程序员)* 都接到相应的通知*/
public class DevTechFrontier extends Observable {public void postNewPublication(String content) {//标识状态或者内容发生改变setChanged();//通知所有观察者notifyObservers(content);}
}
/*** 测试代码*/
public class Test {public static void main(String[] args) {//被观察的角色DevTechFrontier devTechFrontier = new DevTechFrontier();Coder mrsimple = new Coder("mr.simple");Coder coder1 = new Coder("coder-1");Coder coder2 = new Coder("coder-2");Coder coder3 = new Coder("coder-3");//将观察者注册到可观察对象的观察者列表中devTechFrontier.addObserver(mrsimple);devTechFrontier.addObserver(coder1);devTechFrontier.addObserver(coder2);devTechFrontier.addObserver(coder3);//发布消息devTechFrontier.postNewPublication("新的一期开发技术前线周报发布啦!");}
}

        输出结果:

        可以看到所有订阅了开发技术前线的用户都收到了更新消息,一对多的订阅——发布系统就完成了。

        Oblerver和Observable是JDK中内置类型,可见观察者模式是非常重要的,这里Obsserver是抽象的观察者角色,Coder扮演的是具体观察者的角色:Observable对应的是抽象主题角色,DevTechFrontier则是具体的主题角色。Coder是具体的观察者,它们订阅了DevTechFrontier这个具体的可观察对象,当DevTechFrontier有更新时,会遍历所有观察者(这里是Coder),然后给这些观察者发布一个更新的消息,即调用Observer和Observable这些抽象类,因此,Coder和DevTechFrontier完全没有耦合,保证了订阅系统的灵活性、可扩展性。

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

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

相关文章

Unisat的核心成员神秘失踪两个月后,CHAX横空出世

在这个快速变化的数字世界中,故事似乎总是在不断上演。最近,一则消息在加密货币社区中引起了轩然大波:Unisat的核心成员神秘失踪两个月后,CHAX横空出世,带来了一股新的风潮。 受够了BRC20-Swap多次难产,落地…

2023年11月5日网规考试备忘

早上题目回忆: pki体系 ipsec,交换安全(流量抑制) aohdlc bob metclaf —ethernet pon tcp三次握手 OSPF lsa?交换机组ospf配置问题,ping网关可通,AB不通 raid6 300G*8 网络利用率 停等协议10…

VUE多语言i18n配置

1、i18n官网 格式化 | Vue I18n 2、安装i18n 8---指版本号 // vue2必须安装8版本的i18n包,vue3必须安装9版本的i18n包。 npm i vue-i18n8 3、卸载i18n npm uninstall vue-i18n 4、安装 js-cookie npm install vue-cookies --save 5、代码 5.1 main.js /…

ActiveMQ、RabbitMQ、RocketMQ、Kafka介绍

一、消息中间件的使用场景 消息中间件的使用场景总结就是六个字:解耦、异步、削峰 1.解耦 如果我方系统A要与三方B系统进行数据对接,推送系统人员信息,通常我们会使用接口开发来进行。但是如果运维期间B系统进行了调整,或者推送过…

Java后端开发——JDBC组件

JDBC(Java Database Connectivity)是Java SE平台的一种标准API,它提供了一种标准的方法来访问关系型数据库,使得Java程序能够与各种不同的数据库进行交互,这篇文章我们来进行实验体验一下。 自定义JDBC连接工具类 1.编…

stm32整理(三)ADC

1 ADC简介 1.1 ADC 简介 12 位 ADC 是逐次趋近型模数转换器。它具有多达 19 个复用通道,可测量来自 16 个外部 源、两个内部源和 VBAT 通道的信号。这些通道的 A/D 转换可在单次、连续、扫描或不连续 采样模式下进行。ADC 的结果存储在一个左对齐或右对齐的 16 位…

6款优质办公软件,个个都是效率神器,可免费使用

今天给大家分享6款优质的办公软件,这些软件不仅功能强大,还可以免费使用,让你高效完成工作。 Todo清单——待办事项软件 Todo清单是一款强大的跨平台待办事项和时间管理软件。它可以帮助用户记录、跟踪和完成待办事项。通过创建清单&#xff…

异星工场入门笔记-02-一个重要地学习方法

编程学习地整个过程,最重要的工具就是电脑,其中有一个重点就是可以无成本的重复测试,这大大降低了难度,节约了时间。真正难以学习的不是技术本身,而是材料成本和时间成本,降低这两个因素平地起高楼根本不是…

【MySQL】MVCC机制(undo log,read view)

文章目录 前言一. 预备知识二. 模拟MVCC三. Read View四. RC与RR的本质区别结束语 前言 MVCC(多版本并发控制)是一种用来解决读-写冲突的无锁并发控制 MVCC为事务分配单向增长的事务ID,为每个修改保存一个版本,版本与事物ID相关联…

关闭 win10自动更新、关闭激活

做工控或者数据大屏、服务器之类的,都不想系统自动更新,不知不觉自动重启类。 激活过了一段时间,又要重新激活这些事情,所以需要手工去关闭这些服务。 一、关闭 win10自动更新 首先打开 服务,找到windows update: window +R 输入:Services.msc 停止windows update ,然…

【实战Flask API项目指南】之一 概述

实战Flask API项目指南之 概述 本系列文章将带你深入探索实战Flask API项目指南,通过跟随小菜的学习之旅,你将逐步掌握Flask在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧! 前言 小菜是一个Python编程爱好者,他目前…

3dmax经常渲染失败?优化方法提升渲染质量!

3DMAX是一款专业的三维建模、动画和渲染软件,被广泛应用于影视、游戏、建筑、广告等领域。 而云渲染是一种利用云计算技术,将渲染任务分配到海量的服务器上进行并行计算的服务,能够显著提升渲染效率和质量,节省时间和成本。 使用…

Spring之AOP

动态代理 代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 比如,现在存在一个UserService类: public class UserService {public void test() {System.out…

正则表达式续篇

位置锚定: ^:行首锚定,表示以什么为开头 例如: $:行尾锚定,表示以什么为结尾 例如: ^:匹配的是空行 例如: ^root$:匹配整行,而且整行只能有这一个字符串 实验&#x…

第九周实验记录

1、安装Nerfstudio 环境配置 首先需要创建环境python3.8,接着需要安装cuda11.7或11.3 这里安装cuda11.7 pip uninstall torch torchvision functorchpip install torch1.13.1 torchvision functorch --extra-index-url https://download.pytorch.org/whl/cu117安…

浅谈安科瑞电力监控系统在百事亚洲研发中心的应用

摘要:介绍百事亚洲研发中心,采用智能电力仪表、采集配电现场的各种电参量和开关信号。系统采用现场就地组网的方式,组网后通过现场总线通讯并远传至后台,通过Acrel-2000型电力监控系统实现配电所配电回路用电的实时监控和管理。 …

Java——》CAS

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

伊朗网络间谍组织针对中东金融和政府部门

导语 近日,以色列网络安全公司Check Point与Sygnia发现了一起针对中东金融、政府、军事和电信部门的网络间谍活动。这一活动由伊朗国家情报和安全部门(MOIS)支持的威胁行为者发起,被称为"Scarred Manticore"。该组织被认…

世微 dc-dc同步降压 IC AP3466 车载充电器适配器恒压源 电源驱动

产品描述 AP3466 是一款支持宽电压输入的同步降压 电源管理芯片,输入电压 4-30V 范围内可实现 3.6A 的连续电流输出。通过调节 FB 端口的分压 电阻,设定输出 1.8V 到 28V 的稳定电压。 AP3466 具有优秀的恒压/恒流(CC/CV)特性。 AP3466 采用电流模式的环…

03、SpringBoot + 微信支付 ---- 创建订单、保存二维码url、显示订单列表

目录 Native 下单1、创建课程订单保存到数据库1-1:需求:1-2:代码:1-3:测试结果: 2、保存支付二维码的url2-1:需求:2-2:代码:2-3:测试:…