【设计模式】我终于读懂了观察者模式。。。

news2024/11/18 8:20:00

文章目录

  • 🔆天气预报项目需求,具体要求如下
    • 🔆天气预报设计方案 - 普通方案
      • 🔆问题分析
    • 🔆观察者模式
      • 🔆debug下去看一下
      • 🔆观察者模式的好处
      • 🔆观察者模式在Jdk 应用的源码分析

🔆天气预报项目需求,具体要求如下

  1. 气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。
  2. 需要设计开放型 API,便于其他第三方也能接入气象站获取数据。
  3. 提供温度、气压和湿度的接口
  4. 测量数据更新时,要能实时的通知给第三方

🔆天气预报设计方案 - 普通方案

传统的设计方案

在这里插入图片描述

CurrentConditions类, 显示当前天气情况(可以理解成是气象站自己的网站)

在这里插入图片描述

WeatherData类

  1. 包含最新的天气情况信息
  2. 含有 CurrentConditions 对象
  3. 当数据有更新时,就主动的调用 CurrentConditions对象update方法(含 display), 这样他们(接入方)就看到最新的信息

在这里插入图片描述

客户端类

在这里插入图片描述

就是将网站类(CurrentConditions)注册到气象站类(WeatherData)

一旦有数据变化则调用网站的输出方法

在这里插入图片描述

🔆问题分析

  1. 其他第三方接入气象站获取数据的问题
  2. 无法在运行时动态的添加第三方 (新浪网站)
  3. 违反 ocp 原则(“开-闭原则”,一个软件应该对扩展开放,对修改关闭)
  4. 在 WeatherData 中,当增加一个第三方,都需要创建一个对应的第三方的公告板对象,并加入到 dataChange, 不利于维护,也不是动态加入

需要改变的地方

所以引出了我们的观察者模式

气象局:Subject
第三方网站:Observer

Subject:登记注册、移除和通知

  1. registerObserver 注册
  2. removeObserver 移除
  3. notifyObservers() 通知所有的注册的用户,根据不同需求,可以是更新数据,让用户来取,也可能是实施推送, 看具体需求定

Observer:接收输入

🔆观察者模式

对象之间多对一依赖的一种设计方案,被依赖的对象为 Subject,依赖的对象为 Observer,Subject
通知 Observer 变化,比如这里的网站是 Subject,是 1 的一方。用户是 Observer,是多的一方。

在这里插入图片描述

CurrentConditions类

还是上面的类,只不过需要实现Observer接口

在这里插入图片描述

Observer接口

在这里插入图片描述

Subject接口

统一定义了方法, 让WeatherData 来实现

在这里插入图片描述
WeatherData类实现Subject接口,包含最新的天气情况信息 ,含有 观察者集合,使用ArrayList管理
当数据有更新时,就主动的调用 ArrayList, 通知所有的(接入方)就看到最新的信息

在这里插入图片描述

客户端类

在这里插入图片描述

看运行结果是跟上面一样的

在这里插入图片描述

但是我们如果现在又新增了一个网站BaiduSite

在这里插入图片描述

我们只需要实现Observer接口,然后在客户端里面注册进去就好了

在这里插入图片描述

这样我们的气象站类不需要改变任何代码!

🔆debug下去看一下

首先注册了两个网站

在这里插入图片描述

进入setData方法,给自己的属性赋值

在这里插入图片描述

在这里插入图片描述

调用dataChange

在这里插入图片描述

调用notifyObservers方法

在这里插入图片描述

再调用CurrentConditions的update方法

在这里插入图片描述

赋值后调用输出方法

在这里插入图片描述
在这里插入图片描述

流程完毕!!

🔆观察者模式的好处

  1. 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除和通知。
  2. 这样,我们增加观察者(这里可以理解成一个新的公告板),就不需要去修改核心类 WeatherData 不会修改代码, 遵守了 ocp 原则。

🔆观察者模式在Jdk 应用的源码分析

  1. Jdk 的 Observable 类就使用了观察者模式
  2. 代码分析+模式角色分析

Observable类

在这里插入图片描述

他也有增、删、通知方法

在这里插入图片描述
3.模式角色分析

Observable 的作用和地位等价于 我们前面讲过 Subject,Observable 是类,不是接口,类中已经实现了核心的方法 ,即管理 Observer 的方法 add… delete … notify…,Observer 的作用和地位等价于我们前面讲过的 Observer, 有 update

Observable 和 Observer 的使用方法和前面讲过的一样,只是 Observable 是类,通过继承来实现观察者模式

如果用jdk中自带的Observable类改造我们上面的需求就是这样的

CurrentConditions类,实现jdk的Observer

在这里插入图片描述

WeatherData类,继承jdk的Observable类

在这里插入图片描述

BaiduSite类,另外一个网站

在这里插入图片描述

客户端类,老样子

在这里插入图片描述

运行结果

在这里插入图片描述

资料参考:https://www.bilibili.com/video/BV1G4411c7N4

代码地址:https://gitee.com/WangFuGui-Ma/design-pattern/tree/master/design

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

凭借这个笔记,拿下8家大厂offer....

如何拿到多家大厂的offer,没有过硬的实力,就需要不断的学习。 我是如何拿到,阿里,腾讯,百度等八家大厂的offer的,今天我就给大家来分享我的秘密武器,阿里大神整理的包括,测试基础&am…

【MySQL联合查询】轻松实现数据关联

1、联合查询 联合查询又称为多表查询,它的基本执行过程就是笛卡尔积 1.1 认识笛卡尔积 那么什么是笛卡尔积呢? 答:笛卡尔积就是将两张表放在一起进行计算,把第一张表的每一行分别取出来和第二张表的每一行进行连接,得到…

springboot导出excel 多个sheet导出

1.pom.xml <!--文件导出--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><ar…

使用Win10自带的PowerShell命令校验文件和镜像文件的Hash值(MD5、SHA1/256等)正确性

通常为了保证我们从网上下载的文件的完整性和可靠性&#xff0c;我们把文件下载下来以后都会校验一下MD5值或SHA1值&#xff08;例如验证下载的Win10 ISO镜像是否为原始文件&#xff09;&#xff0c;这一般都需要借助专门的MD5检验工具来完成。但其实使用Windows系统自带的Wind…

HTML+CSS(练习)实现棋盘电话拨号盘红绿灯

目录 棋盘HTMLCSS版本HTMLCSSJavaScript版本 电话拨号盘红绿灯 棋盘 HTMLCSS版本 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>作业2591实现棋盘效果</title><style>.container {width: 600px;height: 60…

8.FireWalld防火墙

文章目录 FireWalld防火墙概述firewalld和iptables区别firewalld区域firewalld配置查增删改 FireWalld防火墙 概述 firewalld防火墙是Centos7系统默认的防火墙管理工具&#xff0c;取代了之前的iptables防火墙&#xff0c;也 是工作在网络层&#xff0c;属于包过滤防火墙。 …

vue3 新特性详解(2)

文章目录 自定义Hook函数roRef 其它 Composition APIshallowReactive 与 shallowRefreadonly 与 shallowReadonlytoRaw 与 markRawcustomRefprovide 与 inject响应式数据的判断 Composition Api 的优势。 新的组件.FragmentTeleportSuspensevue3 一些api的转移 自定义Hook函数 …

Flink Hudi DataStream API代码示例

前言 总结Flink通过DataStream API读写Hudi Demo示例&#xff0c;主要是自己备忘用。 最开始学习Flink时都是使用Flink SQL,所以对于Flink SQL读写Hudi比较熟悉。但是对于写代码实现并不熟悉&#xff0c;而有些需求是基于Flink代码实现的&#xff0c;所以需要学习总结一下。仅…

ZYNQ无SD卡配置Linux系统到QSPI Flash和eMMC

硬件&#xff1a;黑金AX7450开发板、zynq7100、QSPI Flash、eMMC Flash 软件&#xff1a;Vivado 2017.4、Petalinux 我用了一台Windows主机&#xff0c;用于设计Vivado和烧写QSPI Flash&#xff0c;一台Ubuntu主机&#xff0c;用于运行Petalinux配置Linux系统。 硬件设计 新建…

10 工具Bootchart的使用(windows)

Bootchart的使用方法&#xff08;windows&#xff09; 下载bootchart.jar并拷贝到windows, 然后保证windows也安装了open jdk 1.8; 下载地址&#xff1a;https://download.csdn.net/download/Johnny2004/87807973 打开设备开机启动bootchart的开关: adb shell touch /data/boo…

生成VLC 及其模块的全面帮助

使用vlc.exe -H命令生成VLC帮助文件vlc-help.txt -h, --help, --no-help 打印 VLC 帮助 (可以和 --advanced 和 --help-verbose 一起使用) (默认禁用) -H, --full-help, --no-full-help VLC 及…

如何创造一个属于自己的springboot stater

如何创造一个属于自己的springboot stater 什么是staterstater是怎么实现注入进来的如何进行约定 基于上述理论的demo实现功能代码目录核心实现spring.factoriesSpringMessageSubscribe&#xff08;扫描所有Subscribe注解生成消息订阅&#xff09;基于Redis的消息订阅基于redis…

对封装好的Vue组件库进行打包,并发布到npm上

1. 新建vue 项目 并且在根目录创建两个文件夹 packages和examples。 packages&#xff1a;用于存放所有的组件 examples&#xff1a;用于进行测试组件&#xff0c;把src改为examples 2.配置vue.config.js 并设置入口文件 如果没有vue.config.js文件 就需要在项目根目录下创…

数说故事@FBIC丨首发食饮SMI社媒心智品牌榜,为品牌支招紧跟健康新风尚

第八届Foodaily创博会&#xff08;FBIC全球食品饮料创新大会&#xff09;于5月14-16日在上海跨国采购会展中心圆满落幕&#xff0c;呈现了一场食品饮料行业盛会。数说故事与众多食饮健康品牌一起&#xff0c;走过了一段大数据AI加持的创新之旅。 数说故事VP孙淑娟Jessie受邀分享…

Android APP 集成系统签名

由于android 系统权限限制&#xff0c;很多时候普通APP权限无法完成&#xff0c;需要系统APP才有足够的权限&#xff0c; 比如&#xff1a;安装、卸载应用&#xff0c;重启设备&#xff0c;恢复出厂设置&#xff0c;以及设置里面的一些功能&#xff0c;都是需要系统权限才能调…

【WLAN网络故障,带你搞定它!】

01 无线网卡搜索不到 AP的无线信号 01 问题现象 无线网卡搜索不到 AP 的无线信号 02 问题分析 无线网卡搜索不到 AP 的信号 ,原因可以从两方面着手&#xff1a; 1.无线网卡 AP本身 在遇到该问题的时候&#xff0c;我们可以从以上两个方面进行处理。 03 处理过程 1.无线…

Python GUI编程:使用wxPython处理长文本

这段代码的应用场景有&#xff1a; 在文本编辑器和IDE等应用程序中&#xff0c;可以使用这个示例代码来处理长文本&#xff0c;以便用户更好地查看和编辑文本。在数据分析和科学计算等领域中&#xff0c;可以使用这个示例代码来显示和处理大量的数据和结果。在日志分析和系统监…

解决方案 TestCenter自动测试软件平台

方案概述 TestCenter是一个专为加速您的测试系统软件开发而设计的自动测试系统软件平台&#xff0c;主要应用于测试程序的开发、运行和管理。TestCenter实现了对测试资源管理、测试程序开发与调试、测试数据管理以及测试程序发布等功能的无缝集成和统一部署&#xff0c;这将帮…

Google I/O 2023 推出Flutter 3.10 快来看看都有哪些变化

本文首发自[慕课网] &#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"及“慕课网公众号”&#xff01; 作者&#xff1a; CrazyCodeBoy |慕课网名师 今年的Google I/O满满的 AI与狠活&#xff0c;而且还推出 Flutter 3…

Flutter一天一控件之ListTile(列表的实现)

ListTile简介 Flutter中的ListTile控件是一种常用的列表项控件&#xff0c;它可以用于显示列表中的每一个项&#xff0c;通常包含标题、副标题、图标等内容。ListTile控件的外观和行为类似于Android中的ListView中的列表项。 一个简单的ListTile示例&#xff1a; ListTile(l…