设计模式-观察者模式

news/2024/9/22 13:28:21

观察者模式

观察者模式(Observer Pattern),又叫发布-订阅(Publisher/Subscribe)模式,模型-视图模式,源-监听器模式或从属者模式。定义一种一对多的依赖关系,一个主题对象可以同时被多个监听者同时监听,使得每当主题对象状态发生变化时,所有依赖于它的对象都会得到通知并被自动更新。属于行为型模式。

应用场景

  • 当一个抽象模型包含两个方面内容,其中一个方面依赖于另一个方面
  • 一个或多个对象的变化依赖于另一个对象的变化
  • 实现类似广播机制的功能,无需知道具体收听者,只需分发广播,系统中感兴趣的对象会自动接收该广播。
  • 多层级嵌套使用,形成一种链式触发机制。使得事件具备跨域通知

角色

  • 抽象主题(Subject):指被观察的对象。该角色是一个抽象类或接口,定义了增加,删除,通知观察者对象的方法
  • 具体主题(ConcreteSubject):具体被观察者,当其内部状态发生变化时,会通知已注册的观察者
  • 抽象观察者(Observer):定义了响应通知的更新 方法
  • 具体观察者(ConcreteObserver):在得到状态更新时,会自动做出响应

使用

一般很少自己去实现,当然真的要去实现,可以在被观察者中维护一份观察者列表,支持注册注销等操作,有一个通知方法即可
JDK本身也提供了该模式的API,将类继承Observeble即可作为被观察者,实现接口Observer,并重写update方法即可作为观察者。使用时只需要将观察者通过addObserver注册进去即可

当然也可以使用谷歌提供的工具,需要引入依赖:

        <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>20.0</version></dependency>

然后通过注解标明监听者即可。
代码如下:
创建Vo 与 PoJo模拟两种类型的事件,只会监听对应的事件

package com.caozz.demo2.observer.guava;public class Pojo {private String name;public Pojo(String name) {this.name = name;}@Overridepublic String toString() {return "Pojo{" +"name='" + name + '\'' +'}';}
}
package com.caozz.demo2.observer.guava;public class Vo {private String name;public Vo(String name) {this.name = name;}@Overridepublic String toString() {return "Vo{" +"name='" + name + '\'' +'}';}
}
package com.caozz.demo2.observer.guava;import com.google.common.eventbus.Subscribe;public class PojoEvent {@Subscribepublic void observer(Pojo pojo){System.out.println("执行PojoEvent方法,传参为:" + pojo);}}
package com.caozz.demo2.observer.guava;import com.google.common.eventbus.Subscribe;public class VoEvent {@Subscribepublic void observer(Vo arg){
//        if(arg instanceof Vo){System.out.println("执行VoEvent方法,传参为:" + arg);
//        }}}
package com.caozz.demo2.observer.guava;import com.google.common.eventbus.EventBus;public class Test {public static void main(String[] args) {EventBus eventBus = new EventBus();PojoEvent guavaEvent = new PojoEvent();VoEvent voEvent = new VoEvent();eventBus.register(guavaEvent);eventBus.register(voEvent);eventBus.post(new Pojo("Tom"));eventBus.post(new Vo("Jerry"));}
}
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

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

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

相关文章

王鼎杯 RCE命令執行 五字節限制

源碼: <?php error_reporting(0); highlight_file(__FILE__); if(strlen($_GET[cmd])<=5 && !preg_match(/rm/,$_GET[cmd])) {echo shell_exec($_GET[cmd]); } ?>对cmd限制长度五字节起初是想通过变量来绕过五字节 但好像不起作用 于是尝试使用 常规做法通…

C - Tile Distance 2

C - Tile Distance 2 https://atcoder.jp/contests/abc359/tasks/abc359_c思路 在x方向上,让s<t 然后 如果s在tile的左边,移动到右边, 如果t在tile的右边,移动到左边, 计算x 和 y方便的必走的steps, y方向上容易计算(跨的格子就是), x方向有些复杂, s在x方向上,…

一、系统学习微服务遇到的问题集合

1、启动了nacos服务,没有在注册列表 应该是版本问题 Alibaba-nacos版本 nacos-文档 Spring Cloud Alibaba-中文 Spring-Cloud-Alibaba-英文 Spring-Cloud-Gateway 写的很好的一篇文章在Spring initial上面配置 start.aliyun.com 重新下载 < 2、 No Feign Client for loadBa…

数组和链表-《算法图解》学习

内存工作原理 需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存 储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它 们的差别很重要。接下来介绍数组和链表以及它们的优缺点。==============to be con…

爬取同样内容,xpath方法会比bs4要慢很多吗?

大家好,我是Python进阶者。 一、前言 前几天在Python白银交流群【沐子山树】问了一个Python网络爬虫的问题,问题如下:爬取同样内容,xpath方法会比bs4要慢很多吗? 二、实现过程 这里【Kimi】给了个思路如下: 爬取网页内容时,使用XPath和BeautifulSoup(bs4)这两种方法的…

FPGA学习网站推荐

FPGA学习网站推荐 本文首发于公众号:FPGA开源工坊 引言 FPGA的学习主要分为以下两部分语法 领域内知识做FPGA开发肯定要首先去学习相应的编程语言,FPGA开发目前在国内采用最多的就是使用Verilog做开发,其次还有一些遗留下来的项目会采用VHDL做开发,现在有一部分公司也开始使…

UaG论文阅读笔记

User-as-Graph: User Modeling with Heterogeneous Graph Pooling for News Recommendation论文阅读笔记 Abstract 现存的问题 ​ 现有的新闻推荐方法通常通过顺序模型或关注模型从用户行为中建立用户兴趣模型。然而,它们无法对用户行为之间的丰富关联性进行建模,而这种关联性…

搭建yolov8模型训练的环境_制作docker镜像_模型训练

搭建yolov8模型训练的环境、制作docker镜像、模型训练搭建一个能进行yolov8模型训练的环境,包括CUDA 11.x、cuDNN 8.x、Ubuntu 18.04、Python 3.8、Cython、NumPy、PyTorch、YOLOv8、Ultralytics等依赖(其实ultralytics 包会包含 YOLOv8 及其相关工具)。在 Docker 容器中,不…