[Java] 观察者模式简述

news2024/10/7 6:39:57

模式定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,他的所有依赖者都会收到通知并且更新
观察者模式简单设计
依照这个图,简单的写一个代码

package Section1.listener;

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

public class ObserverTest {
    public static void main(String[] args) {
        Suject suject = new Suject();
        //把观察者1,2塞到容器里面
        Task1 task1 = new Task1();
        Task2 task2 = new Task2();
        suject.addObserver(task1);
        suject.addObserver(task2);

		//对观察者下达一个 new task 通知
        String msg = "new task";
        suject.notifyObserver(msg);
    }
}

class Suject{
    //容器
    List<Observer> container = new ArrayList<>();
    //add
    public void addObserver(Observer observer){
        container.add(observer);
    }
    //remove
    public void removeObservce(Observer observer){
        container.remove(observer);
    }
    //通知
    public void notifyObserver(Object object){
        for (Observer item : container) {
            item.update(object);
        }
    }
}

interface Observer{
    void update(Object object);
}

//观察者1
class Task1 implements Observer{
    @Override
    public void update(Object object) {
        System.out.println("Task1 get " + object);
    }
}

//观察者2
class Task2 implements Observer{
    @Override
    public void update(Object object) {
        System.out.println("Task2 get " + object);
    }
}

观察者模式的优点是:

  1. 符合开闭原则
  2. 可以在运行时建立对象之间的联系

应用:

  1. JDK
  2. java.util.Observable
  3. Spring

下面是Spring中的应用代码

//相当于上面案例的Observer
@FunctionalInterface
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {
   //相当于update
   void onApplicationEvent(E var1);

   static <T> ApplicationListener<PayloadApplicationEvent<T>> forPayload(Consumer<T> consumer) {
       return (event) -> {
           consumer.accept(event.getPayload());
       };
   }
}

他的发布者是ApplicationEventMulticaster

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

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

相关文章

枚举类型

enum 枚举类型名 {命名枚举常量列表}; enum DAYS {MON, TUE, WED, THU, FRI, SAT, SUN};

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

【报错】sqli-labs靶场搭建出现“Unable to connect to the database: security”

问题描述 搭建sqli-labs靶场时&#xff0c;在配置好PHP和mysql以及db-creds.inc配置文件后 初始界面可以运行&#xff0c;但点击关卡报错 提示连接不到数据库 Unable to connect to the database: security解决方案&#xff1a; 1、数据库配置出错&#xff0c;先查看db-cre…

ad+硬件每日学习十个知识点(11)23.7.22

文章目录 1.怎么使用quartus2编译工程生成sof文件&#xff1f;2.怎么使用quartus2下载程序到fpga芯片&#xff1f;3.为什么sof文件烧录后&#xff0c;fpga断电重启&#xff0c;程序会丢失&#xff1f;4.怎么使用quartus2把sof文件转换成jic文件&#xff1f;5.quartus2分配引脚的…

臻图信息以数字孪生赋能智慧文旅新发展

随着AI、元宇宙的热度持续攀升&#xff0c;以及中共中央办公厅、国务院办公厅此前印发了《“十四五”文化发展规划》、《关于推进实施国家文化数字化战略的意见》等重要文件&#xff0c;要求各地区各部门发挥好对产业的引导、扶持和监管作用。 数字孪生作为元宇宙建设的基石&am…

Pytorch个人学习记录总结 玩俄罗斯方块の深度学习小项目

目录 前言 模型成果演示 训练过程演示 代码实现 deep_network tetris test train 前言 当今&#xff0c;深度学习在各个领域展现出了惊人的应用潜力&#xff0c;而游戏开发领域也不例外。俄罗斯方块作为经典的益智游戏&#xff0c;一直以来深受玩家喜爱。在这个项目中&…

2、HAproxy调度算法

HAProxy的调度算法可以大致分为以下几大类&#xff1a; 静态算法&#xff1a;这类算法的调度策略在配置时就已经确定&#xff0c;并且不会随着负载的变化而改变。常见的静态算法有&#xff1a; Round Robin(轮询) Least Connections(最少连接数) Static-Weight(静态权重) Sourc…

Java16,执行tomcat的startup.bat脚本时一闪而过

win10 JDK16 tomcat-9.0.27 只需两步即可。。并没有其他那些文章说的那么多&#xff0c;什么JRE_HOME了&#xff0c;CLASSPATH了&#xff0c;&#xff0c;完全是乱扯。。。在此之前我从来没有配置过java环境变量。要不是tomcat的启动需要JAVA_HOME&#xff0c;我估计最终我都…

cppcheck使用

cppcheck使用 cppcheck Linux下 cppcheck 是一个静态代码检查工具&#xff0c;支持c, c 代码&#xff1b;作为编译器的一种补充检查&#xff0c;cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括&#xff1a; 自动变量检查 数组的边界检查 class类检查 过期的函数…

计算机图形学十二光线追踪原理及实现细节

Whitted-style&#xff08;递归式&#xff09;光线追踪原理及实现细节 摘要 本篇文章主要分两个部分&#xff0c;第一部分会从为什么需要从光线追踪入手&#xff0c;一步步介绍Whitted-style光线追踪的原理&#xff0c;第二部分会具体介绍一些光线追踪的细节&#xff0c;包括…

谷粒商城第六天-实现功能的前序工作(网关的配置 跨域配置)

目录 一、为什么要做这项工作 1.1 为什么要配置网关 1.2 为什么要使用网关统一配置跨域 二、网关配置 三、统一跨域配置 四、总结 一、为什么要做这项工作 1.1 为什么要配置网关 我们知道网关的作用其实主要就是进行路由的&#xff0c;也就是根据前端发送到网关的请求&…

无涯教程-jQuery - unbind()方法函数

unbind([type]&#xff0c;[fn])方法的作用与bind相反&#xff0c;它从每个匹配的元素中删除绑定事件。 unbind( [type], [fn] ) - 语法 selector.unbind( [type], [fn] ) 这是此方法使用的所有参数的描述- type - 一种或多种事件类型&#xff0c;以空格分隔。 fn …

【机器学习】基础知识点的汇总与总结!更新中

文章目录 一、监督学习1.1、单模型1.1.1、线性回归1.1.2、逻辑回归&#xff08;Logistic Regression&#xff09;1.1.3、K近邻算法&#xff08;KNN&#xff09;1.1.4、决策树1.1.5、支持向量机&#xff08;SVM&#xff09;1.1.6、朴素贝叶斯 1.2、集成学习1.2.1、Boosting1&…

本地文件夹上传到Github

本地文件夹上传到Github 步骤1. 下载git步骤2. 在github中新建一个库&#xff08;Repository&#xff09;步骤3. 设置SSH key步骤4. 添加SSH keys步骤5. 本地文件上传到github参考 步骤1. 下载git 下载git客户端&#xff0c;并在本地安装完成。 步骤2. 在github中新建一个库&a…

解决 Windows 11 原生输入法卡顿问题

文章目录 词库损坏问题方法1. 删除个人词库方法2. 删除中文词库 网络延迟问题方法3&#xff1a;关闭云服务 资源调度问题方法4&#xff1a;调整优先级 升级兼容问题方法5&#xff1a;关闭兼容性&#xff08;针对 Win10 升级 Win11 的部分用户&#xff09; 终极大招 不知道有没有…

嵌入式数据库之SQLite

1.SQLite简介 轻量化&#xff0c;易用的嵌入式数据库&#xff0c;用于设备端的数据管理&#xff0c;可以理解成单点的数据库。传统服务器型数据 库用于管理多端设备&#xff0c;更加复杂。 SQLite是一个无服务器的数据库&#xff0c;是自包含的。这也称为嵌入式数据库&#x…

项目2 | 负载均衡式在线OJ

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a; 《 C G o d 的个人主页》 \color{Darkorange}{《CGod的个人主页》} 《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a; 《编程成神技术交流社区》 \color{Darkorange}{《编程成神技术…

【Vue3】父子组件传参

1. 父组件给子组件传值 父组件App.vue <template><div>父级</div><waterFallVue :title"name"></waterFallVue> </template><script setup lang"ts"> import waterFallVue from ./components/waterFall.vue …

基于Autoencoder自编码的64QAM星座图整形调制解调通信系统性能matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1星座图整形 4.2自编码器 4.3基于Autoencoder的星座图整形调制解调模型 4.4 实现过程 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .…

Vue--》打造个性化医疗服务的医院预约系统(四)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…