【软考】设计模式之观察者模式

目录

          • 1. 说明
          • 2. 应用场景
          • 3. 结构图
          • 4. 构成
          • 5. 优缺点
            • 5.1 优点
            • 5.2 缺点
          • 6. java示例

1. 说明
  • 1.定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
  • 2.也称为模型-视图模式、源-收听者模式或从属者模式。
2. 应用场景
  • 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可以将这二者封装在独立的对象中以使它们可以各自独立地改变复用
  • 2.当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变时。
  • 3.当一个对象必须通知其他对象,而它又不能假定其他对象是谁时,即不希望这些对象是紧密耦合的。
3. 结构图

在这里插入图片描述

4. 构成
  • 1.Subject(目标、抽象主题):知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册删除观察者对象的接口。
  • 2.Observer(观察者):为那些目标发生改变时需获得通知的对象定义一个更新接口
  • 3.ConcreteSubject(具体目标):将有关状态存入各ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。
  • 4.ConcreteObserver(具体观察者):维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与目标的状态保持一致;实现Observer的更新接口,以使自身状态与目标的状态保持一致。
5. 优缺点
5.1 优点
  • 1.解耦:观察者和被观察的对象之间是抽象耦合的。这意味着观察者不需要知道具体有多少个被观察者,只需要知道观察者接口即可。同样,被观察者也不需要知道具体有多少个观察者正在观察它。
  • 2.支持广播通信:当被观察者对象的状态发生变化时,会通知所有注册的观察者对象,实现了一对多的依赖关系管理,无须知道每一个观察者对象,只需维持一个观察者列表。
  • 3.符合开闭原则:可以在不修改现有代码的情况下增加新的观察者,只需要实现观察者接口并注册到被观察者即可。
  • 4.支持异步响应:被观察者可以异步地通知观察者,这样观察者可以根据自己的需要决定何时响应。
5.2 缺点
  • 1.性能问题:当观察者模式被滥用时,可能会导致性能问题。例如,当被观察者状态改变时,如果有很多观察者需要被通知,那么可能会消耗大量的系统资源。
  • 2.循环依赖:如果观察者之间也存在相互依赖的关系,可能会导致循环依赖的问题,使得系统变得复杂且难以维护。
  • 3.可能引发内存泄漏:如果观察者没有正确地注销自己,那么即使应用程序的其他部分不再需要该观察者,它也可能仍然保持活动状态,从而占用不必要的内存。
  • 4.依赖关系不明确:由于观察者和被观察者之间的依赖关系是动态的,这可能导致系统的依赖关系变得不明确和难以跟踪。
6. java示例
  • 1.抽象目标类
package com.learning.observer.product_price;/*** 抽象目标* 注册、移除、通知观察者* 修改产品价格*/
public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();void setPrice(double price);double getPrice();
}
  • 2.具体目标
package com.learning.observer.product_price;import java.util.ArrayList;
import java.util.List;/*** 具体目标*/
public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private double price;@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(this);}}@Overridepublic void setPrice(double price) {this.price = price;// 价格变动时通知所有观察者notifyObservers();}@Overridepublic double getPrice() {return price;}
}
  • 3.抽象观察者
package com.learning.observer.product_price;/*** 抽象观察者*/
public interface Observer {void update(Subject subject);
}
  • 4.具体观察者
package com.learning.observer.product_price;/*** 具体观察者*/
public class ConcreteObserver implements Observer {private String name;  public ConcreteObserver(String name) {  this.name = name;  }  @Override  public void update(Subject subject) {  ConcreteSubject product = (ConcreteSubject) subject;  System.out.println(name + " 收到通知,商品 " + product.getClass().getSimpleName() + " 的价格已变更为 " + product.getPrice());  }  
}
  • 5.客户端
package com.learning.observer.product_price;public class Client {public static void main(String[] args) {  ConcreteSubject product = new ConcreteSubject();  Observer user1 = new ConcreteObserver("用户1");  Observer user2 = new ConcreteObserver("用户2");  product.registerObserver(user1);  product.registerObserver(user2);  // 模拟商品价格变动  product.setPrice(100.0);  // 用户不再关注商品,取消订阅  product.removeObserver(user1);  // 再次模拟商品价格变动  product.setPrice(150.0);  }  
}
  • 6.示例截图
    在这里插入图片描述

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

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

相关文章

关于Double接收到字符串 插入失败 Overflow Exception trying to bind NaN

前端计算 传值给后端NaN 后端接收到之后直接执行插入操作 报错 Error updating database. Cause: java.sql.SQLException: Internal Error: Overflow Exception trying to bind NaN 如果前端传值 NaN 或者 Infinity java是不报错的 只有插入报错 double result1 10.0 / 0; /…

神经网络复习--数学相关基础知识

文章目录 矩阵范数卷积激活函数信息熵 矩阵 标量&#xff1a;一个标量就是一个单独的数向量&#xff1a;一个向量是一列数。这些数是有序排列的。通过次序中的索引&#xff0c;我们可以确定每个单独的数矩阵&#xff1a;矩阵是一个二维数组&#xff0c;其中的每个元素被两个索…

华为机试打卡 HJ5 进制转换

要机试了&#xff0c;华孝子求捞&#xff0c;功德 描述 写出一个程序&#xff0c;接受一个十六进制的数&#xff0c;输出该数值的十进制表示。 数据范围&#xff1a;保证结果在 1≤&#x1d45b;≤2^31−1 输入描述&#xff1a; 输入一个十六进制的数值字符串。 输出描述…

【JAVA】递归

接着上一讲继续&#xff0c;内容不多&#xff0c;讲解一下递归相关内容。 1. 生活中的故事 从前有坐山&#xff0c;山上有座庙&#xff0c;庙里有个老和尚给小和尚将故事&#xff0c;讲的就是&#xff1a; "从前有座山&#xff0c;山上有座庙&#xff0c;庙里有个老和尚…

uos server 无法通过ssh工具连接

问题现象 uos server 服务器操作系统 在虚拟机中安装好之后&#xff0c;防火墙已经关闭&#xff0c;ssh服务已经启动&#xff0c;但通过finalshell等ssh工具连接报错 &#xff1a;java.net.ConnectException: Connection timed out: connect 经过确认 防火墙已关&#xff0c;s…

48.乐理基础-音符的组合方式-休止符

休止符 音乐中总有一些停顿的地方&#xff0c;一次停顿多久是创作人固定好的&#xff0c;休止符就是用来表示每一次停顿多久 需要停顿的位置就用 0 来表示&#xff0c;数字 0 就是简谱中的休止符 音符有全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等&…

你写代码,会关注时间复杂度吗?

虽然面试的时候总是被问到这个问题&#xff0c;但你写代码的时候&#xff0c;真的会想到这个问题吗&#xff1f;时间复杂度&#xff0c;说的当然不是你写的代码执行用了多长时间&#xff0c;而是代码执行语句的次数。 目录 每行代码都需要注意 计算方法 1 例如常量增长 2 …

五子棋对战(网页版)

目录 一、项目背景 用户模块 匹配模块 对战模块 二、核心技术 三、相关知识 WebSocket 原理 报文格式 代码 服务器代码 客户端代码 四、项目创建 4.1、实现用户模块 编写数据库代码 数据库设计 配置MyBatis 创建实体类 创建UserMapper 创建UserMapper接口 实现UserMapper.xml 前…

train_gpt2.c

llm.c/train_gpt2.c at master karpathy/llm.c (github.com) 源码 /* This file trains the GPT-2 model. This version is the clean, minimal, reference. As such: - it runs on CPU. - it does not make the code too complex; it is readable. - it does not use any p…

等保测评技术方案(五)

&#xff08;八&#xff09;漏洞扫描方案 1.参与人员 乙方工程师&#xff1a;谭 然、张 剑等。 范围经过双方确认&#xff0c;此次评估的对象包括&#xff1a; 2.网络设备 IP 地址 设备型号 备注 / / / / / / 以现场测评实际数据为准 3.应用系统 地址 …

SpringBoot集成Curator实现Watch事件监听

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Zookeeper是一个Ap…

缓存不经常更新的动态信息:策略与 Nginx 配置指南

在处理不经常更新的动态信息时&#xff0c;合理配置缓存能够显著提高网站的性能和用户体验。通过缓存这类内容&#xff0c;我们可以减少对后端服务的请求压力&#xff0c;加快内容的加载速度。下面我们会探讨如何在 Nginx 中配置缓存以最大化这种类型的动态内容的效益。 理解动…

kotlin基础知识

val(value的简写)用来声明一个不可变的变量。(只读变量) var(variable的简写)用来声明一个可变的变量。(可读写变量) 在变量声明中指定数据类型时&#xff0c;应在冒号后面添加一个空格。 先声明变量在声明变量的类型。 val a &#xff1a;Int 10 kotlin拥有类型推导机制&…

有哪些可以用电脑做的挣钱副业,有电脑就行

以下是一些可以用电脑做的挣钱副业 1. 写作和翻译 可以在各大网络平台上接单进行写作或者翻译。 2. 做任务 还在做致米宝库这个软件&#xff0c;软件每天会发布一些项目任务&#xff0c;也能学到一些网上赚钱的知识技术&#xff0c;我平时就做些简单任务和一个虚拟项目。 任…

下载npm I就包错解决方案

npm i xxxx -S --legacy-peer-deps 如果包错就执行以上命令

杨校老师项目之基于大数据技术栈hadoop商业web应用的日志分析系统

获取全套资料&#xff1a; 有偿获取&#xff1a;mryang511688 摘要&#xff1a; 互联网世界的先驱者们一致认为大数据将是未来互联网产业&#xff0c;甚至是整个人类各个产业的基础资源&#xff0c;那么到底什么是大数据&#xff0c;大数据给我们的世界是如何带来变化的呢&am…

电子作业指导书系统如何提升医疗设备工厂的生产效率

在医疗设备工厂中&#xff0c;电子作业指导书&#xff08;ESOP&#xff09;正逐渐成为提升生产效率的关键因素。 一、电子作业指导书系统提供了即时可得的准确信息。 电子作业指导书系统与传统的纸质作业指导书相比&#xff0c;员工可以在工作现场通过电子设备随时查阅最新、最…

2024年5月树莓集团快讯

树莓集团近期快讯 1 园区专场招聘会进校园 国际数字影像产业园联合四川城市职业学院的专场招聘会成功召开&#xff0c;共计提供400余个工作岗位。 2 园区硬件优化再升级 园区硬件优化再升级&#xff0c;智能门禁系统及人脸识别系统下周投入使用。 3 基地短剧合作交流 天府…

Apple store 静安·苹果店欣赏

官网&#xff1a; https://www.apple.com/today/Apple 亚洲第一大商店&#xff1a;Apple 静安零售店现已在上海开幕 静安苹果欣赏

CMainFrame中的OnCreatClient()函数

在MFC&#xff08;Microsoft Foundation Classes&#xff09;框架中&#xff0c;OnCreateClient()函数是CFrameWnd类&#xff08;以及继承自它的类&#xff0c;如CMainFrame&#xff09;的一个虚拟成员函数。这个函数被设计来响应窗口客户区的创建过程&#xff0c;即在主框架窗…