观察者模式与观察者模式实例EventBus

什么是观察者模式

顾名思义,观察者模式就是在多个对象之间,定义一个一对多的依赖,当一个对象状态改变时,所有依赖这个对象的对象都会自动收到通知。

观察者模式也称为发布订阅模式(Publish-Subscribe Design Pattern),一般被依赖的对象称为被观察者,依赖的对象称为观察者,不过也有其他的叫法,例如Subject和Observer,Publisher和Subscriber,Producer和Consumer,EvenEemitter(事件发布器)和EventListene,还有Dispatcher和Listener。只要场景符合观察者模式的定义,都算观察者模式的应用。

类图

在这里插入图片描述

  • 主题Subject: 主题中包含着所有调用registerObservers来进行注册的 Observer(观察者) ,主题收到消息后,通过notifyObservers方法,告知所有观察者其状态的改变

  • 观察者Observer: 包含着收到消息的处理逻辑,处理逻辑存在于其update方法中

之前在学习设计模式的时候,有了解过这个模式,在使用MQ中间件的时候其实也有实践过观察者模式,不过这次EventBus又接触到了观察者模式,所以就总结记录一下吧,同时也再复习一下观察者模式。

典型代码实现

是从一个博主那里引用过来的,他写的很详细,博主的详细博文在文末链接。

/**
 * 主题接口
 *
 * @author liuyp
 * @date 2022/11/28
 */
public interface Subject<T> {
    void registerObserver(Observer<T> obverser);

    void removeObserver(Observer<T> obverser);

    void notifyObservers(T message);
}


/**
 * 观察者接口
 *
 * @author liuyp
 * @date 2022/11/28
 */
public interface Observer<T> {
    void update(T message);
}

/**
 * 主题的具体实现
 *
 * @author liuyp
 * @date 2022/11/28
 */
public class ConcreteSubject<T> implements Subject<T> {

    /**
     * 线程安全的Set容器,保存obversers
     */
    private Set<Observer<T>> obversers = new CopyOnWriteArraySet<>();

    @Override
    public void registerObserver(Observer<T> obverser) {
        obversers.add(obverser);
    }

    @Override
    public void removeObserver(Observer<T> obverser) {
        System.out.println("Obversable@" + this.hashCode() + " 移除观察者:" + obverser.hashCode());
        obversers.remove(obverser);
    }

    @Override
    public void notifyObservers(T message) {
        System.out.println("Obversable@" + this.hashCode() + " 发布了一条消息:" + message.toString());
        obversers.forEach(obverser -> obverser.update(message));
    }
}

/**
 * 具体的观察者
 *
 * @author liuyp
 * @date 2022/11/28
 */
public class ConcreteObverser<T> implements Observer<T> {
    @Override
    public void update(T message) {
        System.out.println("Obverser@" + this.hashCode() + " 收到通知:" + message);
    }
}

/**
 * 测试类
 *
 * @author liuyp
 * @date 2022/11/28
 */
public class TestMain {
    public static void main(String[] args) {

        //定义主题 也是被观察者observable
        Subject<String> subject = new ConcreteSubject<>();
        //定义观察者 observer
        Observer<String> observer1 = new ConcreteObverser<>();
        Observer<String> observer2 = new ConcreteObverser<>();
        //订阅主题 subject
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        //发布通知
        subject.notifyObservers("消息1:明天是2022年11月29日");

        //移除观察者1
        subject.removeObserver(observer1);
        //重新发布通知
        subject.notifyObservers("消息2:琪琪农历10月17生日");
    }
}

Obversable@1802598046 发布了一条消息:消息1:明天是20221129Obverser@240650537 收到通知:消息1:明天是20221129Obverser@483422889 收到通知:消息1:明天是20221129Obversable@1802598046 移除观察者:240650537
Obversable@1802598046 发布了一条消息:消息2:琪琪农历1017生日
Obverser@483422889 收到通知:消息2:琪琪农历1017生日

观察者模式的作用

可以使得发布者和订阅者的代码解耦合,增加代码的可靠性和灵活性。

EventBus

下期我们再来说说观察者模式的应用EventBus~

原博客不小心关掉了 找不到了 如有侵权 请博主与我联系我挂上博主原文连接~

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

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

相关文章

ViT-vision transformer

ViT-vision transformer 介绍 Transformer最早是在NLP领域提出的&#xff0c;受此启发&#xff0c;Google将其用于图像&#xff0c;并对分类流程作尽量少的修改。 起源&#xff1a;从机器翻译的角度来看&#xff0c;一个句子想要翻译好&#xff0c;必须考虑上下文的信息&…

【Linux后端服务器开发】MAC地址与其他重要协议

目录 一、以太网 二、MAC地址 三、MTU 四、ARP协议 五、DNS系统 六、ICMP协议 七、NAT技术 八、代理服务器 一、以太网 “以太网”不是一种具体的网路&#xff0c;而是一种技术标准&#xff1a;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容&#xf…

k8s容器日志收集方案

背景 由于以下容器本身特性和现有日志采集工具的缺陷&#xff0c;开发者在收集Kubernetes分布式集群日志时常常遇到困扰&#xff1a; 容器本身特性&#xff1a; 采集目标多&#xff1a;容器本身的特性导致采集目标多&#xff0c;需要采集容器内日志、容器stdout。对于容器…

实验六 调度器-实验部分

目录 一、知识点 1.进程调度器设计的目标 1.1.进程的生命周期 1.2.用户进程创建与内核进程创建 1.3.进程调度器的设计目标 2.ucore 调度器框架 2.1.调度初始化 2.2.调度过程 2.2.1.调度整体流程 2.2.2.设计考虑要点 2.2.3.数据结构 2.2.4.调度框架应与调度算法无关…

Zabbix分布式监控快速入门

目录 1 Zabbix简介1.1 软件架构1.2 版本选择1.3 功能特性 2 安装与部署2.1 时间同步需求2.2 下载仓库官方源2.3 Zabbix-Server服务端的安装2.3.1 安装MySQL2.3.1.1 创建Zabbix数据库2.3.1.2 导入Zabbix库的数据文件 2.3.2 配置zabbix_server.conf2.3.3 开启Zabbix-Server服务2.…

ElementUI Select选择器如何根据value值显示对应的label

修改前效果如图所示&#xff0c;数据值状态应显示为可用&#xff0c;但实际上仅显示了状态码1&#xff0c;并没有显示其对应的状态信息。在排查了数据类型对应关系问题后&#xff0c;并没有产生实质性影响&#xff0c;只好对代码进行了如下修改。 修改前代码&#xff1a; <…

微服务划分的原则

微服务的划分 微服务的划分要保证的原则 单一职责原则 1、耦合性也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密&#xff0c;其耦合性就越强&#xff0c;模块的独立性则越差。模块间耦合高低取决于模块间接口的复杂性、调用的方式及…

JS逆向之猿人学爬虫第20题-wasm

文章目录 题目地址sign参数分析python算法还原往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/20第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 sign参数分…

最优除法(力扣)数学 JAVA

给定一正整数数组 nums&#xff0c;nums 中的相邻整数将进行浮点除法。例如&#xff0c; [2,3,4] -> 2 / 3 / 4 。 例如&#xff0c;nums [2,3,4]&#xff0c;我们将求表达式的值 “2/3/4”。 但是&#xff0c;你可以在任意位置添加任意数目的括号&#xff0c;来改变算数的…

Git的安装以及本地仓库的创建和配置

文章目录 1.Git简介2.安装Git2.1在Centos上安装git2.2 在ubuntu上安装git 3.创建本地仓库4.配置本地仓库 1.Git简介 Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理文件的更改。它可以记录和存储代码的所有历史版本&#xff0c;并可以方便地进行分支管理、合并代码和协…

【自动化运维】Ansible常见模块的运用

目录 一、Ansible简介二、Ansible安装部署2.1环境准备 三、ansible 命令行模块3.1&#xff0e;command 模块3.2&#xff0e;shell 模块3.3&#xff0e;cron 模块3.4&#xff0e;user 模块3.5&#xff0e;group 模块3.6&#xff0e;copy 模块3.7&#xff0e;file 模块8&#xff…

VLAN原理(Virtual LAN 虚拟局域网)

VLAN&#xff08;Virtual LAN 虚拟局域网&#xff09; 1、广播/广播域 2、广播的危害&#xff1a;增加网络/终端负担&#xff0c;传播病毒&#xff0c; 3、如何控制广播&#xff1f;&#xff1f; ​ 控制广播隔离广播域 ​ 路由器物理隔离广播 ​ 路由器隔离广播缺点&…

机器学习深度学习——多层感知机

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——感知机 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 上一节…

VR全景在酒店的发展状况如何?酒店该如何做营销?

现阶段&#xff0c;VR全景技术已经被酒店、民宿、旅游景区、房产楼盘、校园等行业所应用&#xff0c;每天都有不少人通过VR全景展示来了解酒店的设施环境&#xff0c;而酒店也可以借此机会&#xff0c;详细展示自身优势&#xff0c;更大范围吸引顾客。 VR酒店拥有真实、立体的全…

互斥量 的初识

Q: 什么是互斥量&#xff1f; A: 在多数情况下&#xff0c;互斥型信号量和二值型信号量非常相似&#xff0c;但是从功能上二值型信号量用于同步&#xff0c; 而互斥型信号量用于资源保护。 互斥型信号量和二值型信号量还有一个最大的区别&#xff0c;互斥型信号量可以有效解决…

分布式理论:CAP理论 BASE理论

文章目录 1. CAP定理1.1 一致性1.2 可用性1.3 分区容错1.4 矛盾 2. BASE理论3. 解决分布式事务的思路4. 扩展 解决分布式事务问题&#xff0c;需要一些分布式系统的基础知识作为理论指导。 1. CAP定理 Consistency(一致性): 用户访问分布式系统中的任意节点&#xff0c;得到的…

Sentinel dashboard的使用;Nacos保存Sentinel限流规则

Sentinel dashboard的使用 往期文章 Nacos环境搭建Nacos注册中心的使用Nacos配置中心的使用Sentinel 容灾中心的使用 参考文档 Sentinel alibaba/spring-cloud-alibaba Wiki GitHub 限流结果 下载sentinel-dashboard github地址&#xff1a;Sentinel/sentinel-dashboar…

SpringBoot的三层架构以及IOCDI

目录 一、IOC&DI入门 二、三层架构 数据库访问层 业务逻辑层 控制层 一、IOC&DI入门 在软件开发中&#xff0c;IOC&#xff08;Inversion of Control&#xff09;和DI&#xff08;Dependency Injection&#xff09;是密切相关的概念。 IOC&#xff08;控制反转&a…

【腾讯云 Cloud Studio 实战训练营】全新的开发方式,让你实现一站式开发

一、前言 关于 Cloud Studio 全在线云端开发 用户只需要浏览器就可以访问和使用Cloud Studio,无需在本地配置开发环境。Cloud Studio将开发环境部署在云服务器上,用户可以随时随地进行开发。多语言支持 Cloud Studio支持常见的开发语言,如Node.js、Python、Java、PHP等。用户…

Arcgis画等高线

目录 数据准备绘制等高线3D等高线今天我们将学习如何在ArcGIS中绘制等高线地图。等高线地图是地理信息系统中常见的数据表现形式,它通过等高线将地形起伏展现得一目了然,不仅美观,还能提供重要的地形信息。 数据准备 在开始之前,确保已经准备好了高程数据,它通常以栅格数…