观察者模式(java)

news2024/12/28 4:57:38

目录

结构

案例

 代码实现

抽象观察者

抽象主题类

具体观察者

具体主题类

测试类

优缺点

优点

缺点


结构

在观察者模式中有如下角色:

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

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

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

  • ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

案例

【例】微信公众号

在使用微信公众号时,大家都会有这样的体验,当你关注的公众号中有新内容更新的话,它就会推送给关注公众号的微信用户端。我们使用观察者模式来模拟这样的场景,微信用户就是观察者,微信公众号是被观察者,有多个的微信用户关注了程序猿这个公众号。

 代码实现

抽象观察者

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 抽象观察者
 * @date: 2023/7/21 14:38
 */
public abstract class Observer {

    // 更新消息
    abstract void update(String msg);

}

抽象主题类

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 抽象主题类
 * @date: 2023/7/21 14:43
 */
public abstract class Subject {

    // 添加观察者
    public abstract void attach(Observer observer);

    // 删除观察者
    public abstract void delete(Observer observer);

    // 发布消息
    public abstract void notify(String msg);

}

具体观察者

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 用户类
 * @date: 2023/7/21 14:40
 */
public class User extends Observer{

    public String name;
    public User(String name){
        this.name = name;
    }

    @Override
    public void update(String msg) {
        System.out.printf("%s 收到消息: %s\n",this.name,msg);

    }

}

具体主题类

import java.util.ArrayList;
import java.util.List;

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 具体主题类
 * @date: 2023/7/21 14:47
 */
public class SubscriptionSubject extends Subject{

    private List<Observer> list = new ArrayList<Observer>();

    @Override
    public void attach(Observer observer) {
        list.add(observer);
    }

    @Override
    public void delete(Observer observer) {
        list.remove(observer);
    }

    @Override
    public void notify(String msg) {
        // 给每一个观察者发布消息
        for (Observer observer : list) {
            observer.update(msg);

        }
    }

}

测试类

/**
 * @author: ZQH
 * @project: Design Pattern
 * @description 测试类
 * @date: 2023/7/21 14:38
 */
public class Client {
    public static void main(String[] args) {

        SubscriptionSubject accounts = new SubscriptionSubject();

        User user1 = new User("张三");
        User user2 = new User("李四");
        User user3 = new User("王五");

        accounts.attach(user1);
        accounts.attach(user2);
        accounts.attach(user3);

        accounts.notify("大吉大利,今天吃鸡");

        System.out.println("_________");

        accounts.delete(user1);
        accounts.notify("南华大学招新啦!!!");

    }

}

优缺点

优点

  • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。

  • 被观察者发送通知,所有注册的观察者都会收到信息【可以实现广播机制】

缺点

  • 如果观察者非常多的话,那么所有的观察者收到被观察者发送的通知会耗时

  • 如果被观察者有循环依赖的话,那么被观察者发送通知会使观察者循环调用,会导致系统崩溃

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

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

相关文章

C语言每天一练----输出水仙花数

题目&#xff1a;请输出所有的"水仙花数" 题解&#xff1a;所谓"水仙花数"是指一个3位数,其各位数字立方和等于该数本身。 例如, 153是水仙花数, 因为153 1 * 1 * 1 5 * 5 * 5 3 * 3 * 3" #define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h&g…

【Spring】ApplicationEventPublisher 发布订阅模式

概念 关于发布订阅这个词&#xff0c;其实不仅仅出现在Spring框架当中&#xff0c;其实在Redis中也有存在&#xff08;其对应的是convertAndSend()方法&#xff09;&#xff0c;还有在MQ消息队列里也是有的&#xff0c;但这里就主要介绍的是关于Spring框架的ApplicationEventPu…

数据库管理-第九十四期 19c OCM之路-第四堂(02)(20230725)

第九十四期 19c OCM之路-第四堂&#xff08;02&#xff09;&#xff08;20230725&#xff09; 第四堂继续&#xff01; 考点3&#xff1a;SQL statement tuning SQL语句调优 收集Schema统计信息 exec dbms_stats.gather_schems_stats(HR);开启制定表索引监控 create index…

IDEA+SpringBoot + Mybatis + Shiro+Bootstrap+Mysql资产设备管理系统

IDEASpringBoot Mybatis ShiroBootstrapMysql资产设备管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.用户新增3.用户设置4.岗位管理5. 审批节点6. 人员查询7. 组织设置8. 人员调整9.角色设置10.角色模块映射11.模块设置12.应用模块13.光纤交换机14.服务器15.网…

使用的华为云RDS数据库不小心把数据删了

目录 前言恢复qp文件帮助文档表级时间点恢复删除数据的时候要注意 前言 华为云查数据的时候前面是有个序号的&#xff0c;删除数据的时候不小心把序号看成id了&#xff0c;导致误删数据。 注&#xff1a;图片如果看不清楚可以点击放大观看&#xff01; 恢复qp文件 华为云每天…

centos中修改防火墙端口开放配置

1、直接进入文件修改 vim /etc/sysconfig/iptables 2、添加需要开放的端口 &#xff08;1&#xff09;添加需要开放的单个端口 4001 -A INPUT -m state --state NEW -m tcp -p tcp --dport 4001 -j ACCEPT &#xff08;2&#xff09;添加需要开放的某个网段端口 4001:4020 …

Windows Server 2019 中文版、英文版下载 (updated Jul 2023)

Windows Server 2019 中文版、英文版下载 (updated Jul 2023) Windows Server 2019 Version 1809&#xff0c;2023 年 7 月更新 请访问原文链接&#xff1a;https://sysin.org/blog/windows-server-2019/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…

软件测试报告怎么编写?第三方性能报告范文模板来了

前言 软件测试报告是软件测试人员针对产品执行性能测试、功能测试、系统测试等一系列操作生成的测试报告文档。一份清楚记录、分析精确的测试报告文档能帮助测试人员了解测试进度、记录产品的缺陷问题&#xff0c;从而更好地完善产品质量。 在测试报告编写过程中&#xff0c;所…

【考研英语语法及长难句】小结

【 考场攻略汇总 】 考点汇总 考场攻略 #1 断开长难句只看谓语动词&#xff0c;不考虑非谓语动词先找从句&#xff0c;先看主句 考场攻略 #2 抓住谓语动词&#xff0c;抓住句子最核心的表述动作或内容通过定位谓语动词&#xff0c;找到复杂多变的主语通过谓语动词的数量&…

优化企业集成架构:iPaaS集成平台助力数字化转型

前言 在数字化时代全面来临之际&#xff0c;企业正面临着前所未有的挑战与机遇。技术的迅猛发展与数字化转型正在彻底颠覆各行各业的格局&#xff0c;不断推动着企业迈向新的前程。然而&#xff0c;这一数字化时代亦衍生出一系列复杂而深奥的难题&#xff1a;各异系统之间数据…

【网络代理】(三)Docker+Haproxy 搭建四层代理

目录 1.1 创建 web 服务器镜像 1.2 启动 web 服务器容器 2.1 编写 haproxy 配置文件 2.2 拉取 haproxy 镜像 2.3 启动 haproxy 容器 3.1 访问 8000 端口 3.2 查看 web 服务器容器日志 附录&#xff1a;haproxy 仪表板 1.1 创建 web 服务器镜像 编写一个 Docke…

Java Object字节流及序列化和反序列化

Java中的对象字节流是通过ObjectInputStream和ObjectOutputStream类来实现的。这两个类提供了将对象转换为字节流和将字节流转换为对象的方法。 要将一个对象转换成字节流&#xff0c;你需要先创建一个ObjectOutputStream对象&#xff0c;然后使用它的writeObject()方法将对象…

AIGC,你看我还有机会吗?| 融云前沿

点击报名 8 月 3 日&#xff08;周四&#xff09;融云直播课~ 2022 年底&#xff0c;以 ChatGPT 为代表的“生成式 AI”正式开启了 AI 行业爆点不断的热闹时刻。关注【融云全球互联网通信云】了解更多 傅盛和朱啸虎关于大模型是否还有机会的隔空激辩余热未散&#xff0c;Meta …

VS2017制作安装包关于生成x86或x64报错解决办法

报错如下&#xff1a; ERROR: File System.Data.SQLite.dll targeting AMD64 is not compatible with the projects target platform x86 解决办法&#xff1a; 选中安装包项目按下F4弹出属性弹窗修改目标平台 改为 x64即可

国内攻克OLED屏幕修复术,成本暴降2/3不用拆机换屏

连着许多年各家手机发布会&#xff0c;屏幕基本是会花大精力宣传的三大件之一 也对&#xff0c;无论是外观还是实际的视觉、操作体验&#xff0c;屏幕都是非常重要的一环。 屏幕素质越来越高&#xff0c;用着也的确更爽了&#xff0c;但也越来越不敢摔了。 普普通通的一块 60…

【LeetCode每日一题】——剑指 Offer 30.包含min函数的栈

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 简单 三【题目编号】 剑指 Offer 30.包含min函数的栈 四【题目描述】 定…

7.6Jmeter5.1:接口测试实践

需求&#xff1a;需要往平台新增5000条接口数据&#xff0c;这里用到随机数(其实随机数也会重复&#xff0c;如果真实压测可以用文件方式真实导入去测) 1、随机数函数&#xff0c;使用函数助手生成 使用&#xff1a;${__Random(200,5200,)} 2、登录请求 2.1、登录的请求头 C…

深入学习java虚拟机||JVM内存结构五大模型

目录 程序计数器 栈 虚拟机栈 垃圾回收是否涉及栈内存&#xff1f; 栈内存分配越大越好吗&#xff1f; 方法内的局部变量是否线程安全&#xff1f; 栈内存溢出 本地方法栈 堆 方法区 先看内存图总览 程序计数器 定义&#xff1a;全称P r o g r a m C o u n t e r R e …

【算法与数据结构】226、LeetCode翻转二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;这道题的思路很简单&#xff0c;本质上就是遍历每一个节点&#xff0c;然后交换左右节点。我们可以用前…

吃透《西瓜书》第一章绪论、第二章模型评估

目录 第一章 绪论 1.1 引言 1.2 基本术语 1.3 假设空间 第二章 模型评估 2.1 为什么需要模型评估&#xff1f; 2.2 模型评估的定义 2.2.1 评估方法之留出法: 2.2.2 交叉验证法和自助法 2.3 深入理解模型评估 第一章 绪论 1.1 引言 机器学习是什么&#xff1f; 机器…