java(面向对象)的23种设计模式(11)——观察者模式

news2024/11/27 15:40:31

一、定义

观察者模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
换种说法,定义两种对象,观察者和目标对象,多个观察者同时监听一个目标对象,一旦这个目标对象发生改变,这些观察者都能立马知道并作出反应。
观察者模式又叫发布-订阅模式、模型-视图模式,它是对象行为型模式。
举个栗子:
最近世界杯,假设内马尔是目标对象,观众是观察者,内马尔连过五人射门成功,观众热烈鼓掌;内马尔被恶意犯规,观众发出嘘~声。

二、结构

如图所示:抽象观察者,抽象目标对象,具体观察者,具体目标对象。
在这里插入图片描述

三、代码实现

抽象目标:

/**
 * 目标对象——被观察者
 */
public interface MyTestSubject<T> {

    void setState(Integer state);

    //加入观察者
     void register(T t);
    //移除观察者
     void remove(T t);
    //通知观察者
     void notifyOthers();

}

抽象观察者:

/**
 * 抽象观察者
 */
public interface MyTestObserver {
    //事件发生
    void update();
}

具体目标对象:

/**
 * 具体目标对象
 */
public class StateSubject implements MyTestSubject<MyTestObserver> {

    private List<MyTestObserver> observers = new ArrayList<>();

    Integer state;

    public Integer getState() {
        return state;
    }

    @Override
    public void setState(Integer state) {
        this.state = state;
        notifyOthers();
    }

    @Override
    public void register(MyTestObserver iObserver) {
        observers.add(iObserver);
    }

    @Override
    public void remove(MyTestObserver iObserver) {
        observers.remove(iObserver);
    }

    public void notifyOthers() {
        for (MyTestObserver iObserver : observers) {
            iObserver.update();
        }
    }
}

具体观察者:

**
 * 具体观察者
 */
public class StateObserver implements MyTestObserver {

    @Override
    public void update() {
        System.out.println("状态改变");
    }
}

测试代码:

  public static void main(String[] args) {
        MyTestObserver myTestObserver = new StateObserver();
        MyTestSubject<MyTestObserver> myTestSubject = new StateSubject();
        //加入观察者队列
        myTestSubject.register(myTestObserver);
        //目标更改状态并通知
        myTestSubject.setState(11);
    }

结果如下:

状态改变

四、应用

1、jdk

jdk中是提供了接口和抽象类来实现观察者功能的。包含两个类:java.util.Observable 和 java.util.Observer。前者是被观察者,后者是观察者。
代码实现类似于上面自己定义的观察者逻辑,只是抽象的观察者和目标对象jdk给提供了。

2、Spring

Spring中的事件监听 机制,Spring中的ContextLoaderListener实现ServletContextListener,ServletContextListener又继承JDK的EventListener,实现事件监听。

五、优缺点

优点:
1.观察者和被观察者都是松耦合(抽象耦合),符合依赖倒置原则。
2.分离了表示层(观察者)和数据逻辑层(被观察者者),并且建立了一套触发机制,使得数据的变化可以响应到多个表示层。
3.实现了一对多的通信机制,只有订阅的观察者可以接受通知。
缺点:
1.如果观察者过多,则事件通知会耗时较长。
2.事件通知仅告知发生变化,未告知怎么发生了变化。
3.观察者和被观察者可能存在循环依赖,可能造成循环调用,导致系统崩溃。

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

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

相关文章

高等数学基础概念的Python开发实现

一般的数学算式math函数库就可以解决了&#xff0c;如果是涉及到高等数学极限&#xff0c;微积分等知识&#xff0c;就需要用到sympy科学计算库&#xff0c;它是专门用来解决数学的运算问题的。 Sympy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统&…

你的团队是王者还是青铜(上)

&#xff08;图片来源&#xff1a;https://unsplash.com/photos/RxOrX1iW15A&#xff09; 4月18日早上9点30分&#xff0c;团队跟着大屏计时器整齐地喊出倒计时&#xff0c;“五、四、三、二、一”&#xff0c;Tech Lead 强哥和 PO 小楠相对看了一眼&#xff0c;一起按下了eart…

双端 Diff 算法原理解析及 snabbdom 简单实现

一、准备工作 先找个放猪的容器canvas,这里宽设置了1200&#xff0c;高设置了600 <canvas width"1200" height"600" id"canvas">当前浏览器不支持canvas元素</canvas> 然后获取它进行操作 const canvas document.getElementById(…

让人头皮发麻的Android 性能优化版块,这样简单就学会了?

对现如今的Android 开发们来讲&#xff0c;不管是在面试还是日常工作当中&#xff0c;性能优化 都是一个绕不开的难题。 以下这些场景&#xff0c;大家或多或少都有遇到过&#xff1a; 1. 当你很努力地优化了应用的性能后&#xff0c;用户依然不断抱怨应用卡顿、启动速度慢等…

005. 组合总和 II

1.题目链接&#xff1a; 40. 组合总和 II 2.解题思路&#xff1a; 树层&#xff1a;同层遍历 树枝&#xff1a;递归遍历 2.1.题目要求&#xff1a; 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candi…

6.终于了解volatile的原理和使用方法了

1.volatile能保证可见性 先说个案例&#xff1a; 有两个线程A和B&#xff0c;有一个公共的 boolean flag 标记位&#xff0c;最开始赋值为 true&#xff1b;B线程循环&#xff0c;根据这个flag来进行执行或者退出&#xff1b;这时线程A把flag改成false这个时候希望线程B看到变…

python安全工具开发笔记(三)——python 多线程

一、Python线程和进程 进程 进程是程序的一次执行。每个进程都有自己的地址空间、内存、数据栈及其它记录其运行轨迹的辅助数据。 线程 所有的线程运行在同一个进程当中&#xff0c;共享相同的运行环境。线程有开始顺序执行和结束三个部分。 帮助理解&#xff1a; 1、计算…

vs2019+Qt 使用 Qlabel 在界面上显示图像及显示失真问题

在使用 Qt 设计界面时&#xff0c;通常会涉及到在界面上显示图片的问题&#xff0c;而要在界面上显示图片需要使用控件 Qlabel 和 函数 QImage &#xff0c;下面对控件和函数逐一做出介绍&#xff01;&#xff01;&#xff01; 一、Qlabel 常见成员方法 1、setText(const QSt…

全国批发市场情况萧条,进销存系统或是业务转机

如今批发市场情况大不如前&#xff0c;越发惨淡&#xff0c;令人不禁扼腕叹息。让我们深入批发行业&#xff0c;撇开大环境因素&#xff0c;来究竟发现什么是导致批发市场的萧条现状的原因。 1、物流快速发展&#xff0c;失去地域优势 在90年代初&#xff0c;各地交通不便&…

idea相关配置-----java

导入项目 打开项目src的上一层目录即可 导入之后如果可以正常运行就不用看下面操作了&#xff0c; 如果不能运行可以参考下面内容 配置 1.jdk配置 2.添加项目jar包&#xff0c;然后应用 配置完成了 常用快捷键 快捷代码 sout 输出 forr 创建倒序 for循环 fori 创建 for循环…

国外Windows主机的特点

虚拟主机是一项为用户提供在线系统的服务&#xff0c;用于存储信息、图像、视频或其他可以通过互联网轻松访问的文件。而Windows虚拟主机是其中的一个类别&#xff0c;使用这款主机的用户需要和其他共享一个服务器——包括物理服务器和软件应用程序。目前&#xff0c;大多数应用…

Cesium For Unity3d 最新实践流程-2022-12-01

目录 Cesium-Unity3d 最新实践流程 一、前言 二、实践 1、Unity 安装 2、Cesium for Unity 下载 3、打开项目 4、编辑、运行项目 4、效果 Cesium For Unity3d 最新实践流程 一、前言 2022年11月30日晚11点30分&#xff0c;Cesium for Unity 开源插件预览版发布&#…

7.axios的基本使用

Axios是专注于网络数据请求的库&#xff0c;比jQuery更轻量&#xff0c;项目地址 下载解压后在dist中可以找到axios.js&#xff0c;在html文件中引用它就好了 目录 1 GET请求 2 POST请求 3 axios() 1 GET请求 服务是两个数相加 返回的res对象有六个属性&#xff0c;你…

【Python】基础语法1(常量与表达式、变量和类型、注释、输入输出、运算符)

文章目录1、常量与表达式2. 变量和类型2.1 变量是什么2.2 变量的语法2.3 变量的类型2.3.1整数2.3.2 浮点数2.3.3 字符串2.3.4 布尔2.3.5 其他2.4 变量类型的意义2.5 动态类型特性3. 注释3.1 注释的语法3.2 注释的规范4. 输入输出4.1 通过控制台输出4.2 通过控制台输入5. 运算符…

java - 数据结构,时间复杂度和空间复杂度

一、算法效率 算法效率分析分为两种&#xff1a;第一种是时间效率&#xff0c;第二种是空间效率。 时间效率被称为时间复杂度&#xff0c;而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度&#xff0c;而空间复杂度主要衡量一个算法所需要的额外空间&am…

子不语发生工商变更:注册资本增至3000万元,预计全年净利润下滑

近日&#xff0c;浙江子不语电子商务有限公司&#xff08;下称“子不语”&#xff09;发生工商变更&#xff0c;其中注册资本由2600万元增至3000万元。据天眼查信息显示&#xff0c;子不语的全资股东为ZIBUYU INTERNATIONAL LIMITED&#xff0c;法定代表人为华丙如。 据了解&am…

【前端验证】验证自动化脚本的最后一块拼图补全——gen_tb

我们的目标是┏ (゜ω゜)=☞芯片前端全栈工程师~喵! 前言 在完成了 【芯片前端】可能是定向验证的巅峰之作——auto_testbench_尼德兰的喵的博客-CSDN博客 【python脚本】用于生成简单握手接口与自测环境的gen_uvm_agent脚本_尼德兰的喵的博客-CSDN博客 两个工具之后,对于…

[附源码]计算机毕业设计springboot体育器材及场地管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Unity数字孪生UI设计——导入视频

Unity导入mp4或URL链接 1、准备视频 Uinty3D常用视频格式: mov、.mpg、.mpeg、.mp4、.avi .asf 如果都不识别,试试转换成ogv格式 转换完成之后,将视频素材文件拖入Uinty Assets文件夹内 2、创建UI及添加组件 1、右键Assets文件夹或任意文件夹→Create→Render Texture纹理渲…

七、Sleuth分布式链路请求跟踪

SpringCloud Sleuth分布式链路请求跟踪 概述 为什么会出现这个技术&#xff1f;需要解决哪些问题&#xff1f; 问题 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果&#xff0c;每一个前端请求都会形…