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

目录

          • 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,一经查实,立即删除!

相关文章

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

文章目录 矩阵范数卷积激活函数信息熵 矩阵 标量&#xff1a;一个标量就是一个单独的数向量&#xff1a;一个向量是一列数。这些数是有序排列的。通过次序中的索引&#xff0c;我们可以确定每个单独的数矩阵&#xff1a;矩阵是一个二维数组&#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 就是简谱中的休止符 音符有全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等&…

五子棋对战(网页版)

目录 一、项目背景 用户模块 匹配模块 对战模块 二、核心技术 三、相关知识 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…

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

以下是一些可以用电脑做的挣钱副业 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 静安零售店现已在上海开幕 静安苹果欣赏

Verilog中信号发生器的代码实现

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 描述 题目描述&#xff1a; 请编写一个信号发生器模块&#xff0c;根据波形选择信号wave_choise发出相应的波形&#xff1a;wave_choice0时&#xff0c;发出方波信号&#xff1b;wave_choice1时&#xff0c;发出锯齿…

网页版五子棋的自动化测试

目录 前言 一、主要技术 二、测试环境的准备部署 三、测试用例 四、执行测试 4.1、公共类设计 创建浏览器驱动对象 测试套件 释放驱动类 4.2、功能测试 登录页面 注册页面 游戏大厅页面 游戏房间页面 测试套件结果 4.3、界面测试 登录页面 注册页面 游戏大…

MoonBit 本周有重磅更新!枚举构造器支持可变字段、数组字面量默认构建 Vector

MoonBit更新 支持了构造器的 payload 中出现 mutable field&#xff0c;使用方式如下&#xff1a; enum E {C(mut ~x : Int, mut ~y : Int) } derive(Debug)fn swap_xy(x : E) -> Unit {match x {// ~y 会绑定模式匹配前 C 中的 y 字段的值// 当看到 C(..) as c 这种模式时…

visual sudio使用-创建空项目-创建cpp文件

新建空项目 新建cpp文件 #include <iostream> using namespace std;int main() {cout << "hello vs" << endl;cout << "hello c" << "\n";cout << "hello first day\n"; }

LeetCode416:分割等和子集

题目描述 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 解题思想 [1,5,11,5] 和为22&#xff0c;其中一半为 11。如果能寻找到若干数的和为11则成立可以抽象为一个0-1背包问题&#xff1a;容…

MATLAB绘制蒸汽压力和温度曲线

蒸汽压力与温度之间的具体关系公式一般采用安托因方程&#xff08;Antoine Equation&#xff09;&#xff0c;用于描述纯物质的蒸汽压与温度之间的关系。安托因方程的一般形式如下&#xff1a; [\log_{10} P A - \frac{B}{C T}] 其中&#xff0c; (P) 是蒸汽压&#xff08…

【刷题】一篇文章搞定“位运算”

只要春天不死&#xff0c;就有迎春的花朵年年岁岁开放&#xff0c;生命讲涅槃&#xff0c;生生不息&#xff0c;并会以另一种形式永存。 – 路遥 《平凡的世界》 (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥ (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥…