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

目录

          • 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;

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }

    @Override
    public void setPrice(double price) {
        this.price = price;
        // 价格变动时通知所有观察者
        notifyObservers();
    }

    @Override
    public 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.示例截图
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 发布到 Win7+

.Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 实测可以完整运行在 win7sp1/win10/win11. 如果用其他工具打包,还可以运行在mac/linux下, 传送门BlazorHybrid 发布为无依赖包方式 安装 WebView2Runtime 1.57 MB或136 MB 测试DEMO 发布为依赖包方式 安装 WebView2Runtime 1.…

JETBRAINS IDES 分享一个2099通用试用码!WebStorm 2024 版 ,支持一键升级

文章目录 废话不多说上教程&#xff1a;&#xff08;动画教程 图文教程&#xff09;一、动画教程激活 与 升级&#xff08;至最新版本&#xff09; 二、图文教程 &#xff08;推荐&#xff09;Stage 1.下载安装 toolbox-app&#xff08;全家桶管理工具&#xff09;Stage 2 : 下…

ChatGLM 本地部署指南(问题解决)

硬件要求&#xff08;模型推理&#xff09;&#xff1a; INT4 &#xff1a; RTX3090*1&#xff0c;显存24GB&#xff0c;内存32GB&#xff0c;系统盘200GB 如果你没有 GPU 硬件的话&#xff0c;也可以在 CPU 上进行推理&#xff0c;但是推理速度会更慢。 模型微调硬件要求更高。…

扫描工具xary

xary(被动扫描) 与bp进行联动 优点 流量小,结果精准 浏览器将流量传给bp8080端口,再从bp传给xray7777端口,最后到服务器 目的是可以从bp清晰的看到访问的流量包,发到xray后会这些流量包进行扫描,鼠标点击目标哪个功能就会进行功能点的扫描 .\xray.exe webscan --list…

从XML配置角度理解Spring AOP

1. Spring AOP与动态代理 1.1 Spring AOP和动态代理的关系 Spring AOP使用动态代理作为其主要机制来实现面向切面的编程。这种机制允许Spring在运行时动态地创建代理对象&#xff0c;这些代理对象包装了目标对象&#xff08;即业务组件&#xff09;&#xff0c;以便在调用目标对…

车企大佬争做IP,谁掌握了社媒流量密码?

“流量时代&#xff0c;酒好也怕巷子深。” 环顾过去的四周&#xff0c;可能是2024年以来汽车圈最热闹的时刻&#xff0c;车企掌门人轮番“卷入”直播间&#xff0c;现身车展积极互动。 我们看到了吉利董事长李书福、奇瑞汽车董事长尹同跃、长城汽车董事长魏建军、蔚来汽车创始…

idm下载到99.99%不动了 idm突然不下载了 idm下载到最后没速度咋办 IDM下载后没网了是怎么回事

idm能够帮助我们下载不同类型的网页视频&#xff0c;并且基于多线程下载技术的助力下使其下载速度比原来提升数倍以上&#xff0c;因此成为了许多朋友下载的小助手。但也有朋友反映idm下载网页视频超时连接不上&#xff0c;idm下载网页视频突然停止&#xff0c;究竟这些情况我们…

linux部署安装DataX和DataX-Web

1.基础环境 JDK&#xff08;1.8 及其以上都可以&#xff0c;推荐 1.8&#xff09;&#xff0c;安装过程略 Python&#xff08;2 或者 3 都可以&#xff09;&#xff0c;安装过程略 Apache Maven 3.6.1&#xff08;只有DataX源码编译安装时需要&#xff09; 1.1下载maven安装…

win11 安装oracle11g详细流程及问题总结

1.安装包下载地址 本案例操作系统&#xff0c; Oracle 11g下载-Oracle 11g 64位/32位下载官方版(附详细的安装图解教程) - 多多软件站多多为大家免费提供Oracle 11g下载&#xff0c;包含64位/32位官方版本&#xff0c;并附详细的Oracle 11g安装图解教程&#xff0c;同时希望能…

文本处理三剑客grep,awk,sed-读书笔记(十四)

文本处理三剑客{ 1.内容过滤器 > grep 2.文本分析器 > awk 3.行文本处理器 > sed } grep内容过滤器 grep命令是Linux系统中一个非常强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。grep全称是Global Regular Expr…

二百三十六、Kettle——修改MySQL中历史数据为当前系统日期同步到MySQL另一张表中并且每日数据逐渐减少

一、目的 由于一些雷达死了但是又需要有数据进行展示&#xff0c;于是就把这些雷达的历史数据&#xff0c;修改日期为当前日期后&#xff0c;同步到MySQL另一张表中&#xff0c;并且每日每台雷达的数据逐渐减少&#xff0c;等同于人为创建数据问题 二、实施步骤 &#xff08;…

LOTO示波器软件PC缓存(波形录制与回放)功能

当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形。一帧数据的量 是 当前用户选择时基档位缓冲区总数据大小。不同时基档位缓冲区大小不同&am…

极狐GitLab 容器镜像安全扫描实践【下】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

element-plus的ElNotification 内容换行显示

效果图&#xff1a; 代码&#xff1a; const excelSuccess ({ data, status, message }) > {if (status 20005) {const msg message.replace(/\,/g, "<br />");//把,替换成换行符<br />ElNotification({dangerouslyUseHTMLString: true,//加此属性…

YOLOv9全网最新改进系列::YOLOv9完美融合双卷积核(DualConv)来构建轻量级深度神经网络,目标检测模型有效涨点神器!!!

YOLOv9全网最新改进系列&#xff1a;&#xff1a;YOLOv9完美融合双卷积核&#xff08;DualConv&#xff09;来构建轻量级深度神经网络,目标检测模型有效涨点神器&#xff01;&#xff01;&#xff01; YOLOv9原文链接戳这里&#xff0c;原文全文翻译请关注B站Ai学术叫叫首er …

品牌设计理念和logo设计方法

一 品牌设计的目的 设计是为了传播&#xff0c;让传播速度更快&#xff0c;传播效率更高&#xff0c;减少宣传成本 二 什么是好的品牌设计 好的设计是为了让消费者更容易看懂、记住的设计&#xff0c; 从而辅助传播&#xff0c; 即 看得懂、记得住。 1 看得懂 就是让别人看懂…

数字人实训室助推元宇宙人才培养

如今&#xff0c;全身动作捕捉设备已经大量应用在影视、动画、游戏领域&#xff0c;在热门的元宇宙内容领域中&#xff0c;全身动作捕捉设备逐步发挥着重要的作用&#xff0c;在包括体育训练、数字娱乐虚拟偶像、虚拟主持人、非物质文化遗产保护等等场景&#xff0c;数字人实训…

【stm32HAL库】ADC多通道DMA采集

一、介绍一下HAL库函数 1.ADC 2.DMA 二、实验思路 1.根据数据手册直到PC1&#xff0c;PA2&#xff0c;PA3分别为ADC123的通道11&#xff0c;2&#xff0c;3&#xff0c;我们就用这三个通道来采集&#xff0c;每一个通道采集 50 次&#xff0c;即一共需要DMA传输150个数据 2.由…

镊子蜡烛如何抓住反转进行交易?昂首资本2步抓住反转

很多投资者通过之前的文章知道镊子烛台图&#xff0c;甚至可以通过镊子烛台图有多倍收益&#xff0c;但是很多投资者又迷惑了&#xff0c;为什么我没有通过镊子烛台图获得收益&#xff0c;甚至有时还会亏损收手。其实事情很容易理解&#xff0c;Anzo Capital昂首资本认为那是因…

【光线重塑技术】小姐姐,美得不可方物——lllyasviel/ic-light

在英伟达自18年宣布光追技术之后&#xff0c;RTX显卡也成了目前Steam游戏的常客。就连 AMD、Intel 和 Apple Silicon 都宣布要在GPU上支持光追算法。这次我要介绍的是huggingface上比较火的relight技术—— ic-light 介绍 IC-Light 是一个操纵图像照明的项目。 IC-Light &qu…