[Java] 观察者模式简述

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

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<>();//addpublic void addObserver(Observer observer){container.add(observer);}//removepublic 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{@Overridepublic void update(Object object) {System.out.println("Task1 get " + object);}
}//观察者2
class Task2 implements Observer{@Overridepublic 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 {//相当于updatevoid onApplicationEvent(E var1);static <T> ApplicationListener<PayloadApplicationEvent<T>> forPayload(Consumer<T> consumer) {return (event) -> {consumer.accept(event.getPayload());};}
}

他的发布者是ApplicationEventMulticaster

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

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

相关文章

前端程序员入门:先学Vue3还是Vue2?

一、前言 对于新手来说&#xff0c;学习Vue.js框架时往往会有这样一个疑问&#xff1a;应该先学习Vue2还是直接学习Vue3&#xff1f;在回答这个问题之前&#xff0c;我们先简单介绍一下Vue.js框架。 Vue.js是一个轻量级的MVVM(Model-View-ViewModel)框架&#xff0c;它以数据驱…

el-table表格自动滚动

实现效果如下&#xff1a; 功能点&#xff1a; 1. 当表格内容超出时&#xff0c;自动滚动&#xff0c;滚动到最后一条之后在从头滚动。 2. 表格中的数据会定时刷新&#xff0c;刷新后数据更新。 3. 鼠标移入表格中&#xff0c;停止滚动&#xff1b;移出后&#xff0c;继续滚…

nginx几种常见的负载均衡策略

在服务器集群中&#xff0c;Nginx起到一个代理服务器的角色&#xff08;即反向代理&#xff09;&#xff0c;为了避免单独一个服务器压力过大&#xff0c;将来自用户的请求转发给不同的服务器。 根据权重负载均衡 指定轮询几率&#xff0c;weight和访问比率成正比&#xff0c…

算法训练营第四十九天||● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

● 121. 买卖股票的最佳时机 暴力和贪心都可以解决 主要讲解动态规划 dp数组&#xff1a;我们把dp数组定义为一个二维的vector容器 dp[i][0]表示第i天持有股票手中的金额&#xff1a;它可以是当天买入的也可以是之前买入的 dp[i][1]表示第i天不持有股票手中的金额&#xf…

VXLAN集中式网关部署(静态方式)

目录 1. 网络拓扑1.1 配置思路1.2 数据准备2. 配置Underlay网络2.1 配置CE12.2 配置CE22.3 配置CE32.4 查看OSPF结果2.5 配置LSW12.6 配置LSW23. 配置Overlay网络二层互通(同网段)3.1 配置CE13.2 配置CE23.3 配置CE33.4 Server13.5 Server23.6 Server33.7 Server43.8 抓包分析…

Kafka入门到起飞系列 - 副本机制,什么是副本因子呢?

我们一直在讲一个主题会有多个分区&#xff0c;这多个分区可以分布在一台服务器上&#xff0c;也可以分布在多台服务器上&#xff0c;还可以增加分区&#xff08;Kafka目前只支持分区&#xff09;&#xff0c;这是Kafka提供的一种横向扩展的手段 比如我们创建了一个主题&#x…

YAML+PyYAML笔记 2 | YAML缩进、分离、注释简单使用

2 | YAML缩进、分离、注释简单使用 1 简介2 缩进3 分离4 多行文本4.1 折叠块4.2 字面块4.3 引用块 5 注释5.1 行内注释5.2 块注释5.3 完美注释示例 1 简介 YAML 不是一种标记语言&#xff0c;而是一种数据格式&#xff1b;使用缩进和分离来表示数据结构&#xff0c;不需要使用…

与 ChatGPT 进行有效交互的几种策略

在这篇文章中&#xff0c;您将了解即时工程。尤其&#xff0c; 如何在提示中提供对响应影响最大的信息什么是角色、正面和负面提示、零样本提示等如何迭代使用提示来利用 ChatGPT 的对话性质 废话不多说直接开始吧&#xff01;&#xff01;&#xff01; 提示原则 快速工程是有…

Safari 查看 http 请求

文章目录 1、开启 Safari 开发菜单2、显示 JavaScript 控制台 1、开启 Safari 开发菜单 Safari 设置中&#xff0c;打开开发菜单选项 *** 选择完成后&#xff0c;Safari 的目录栏就会出现一个 开发 功能。 2、显示 JavaScript 控制台 开启页面后&#xff0c;在开发中选中 显…

【Linux后端服务器开发】数据链路层

目录 一、以太网 二、MAC地址 三、MTU 四、ARP协议 一、以太网 “以太网”不是一种具体的网路&#xff0c;而是一种技术标准&#xff1a;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容&#xff0c;例如&#xff1a;规定了网络拓扑结构、访问控制方式、传…

@Bean的作用

Bean通常和Configuration注解一起使用 Bean可以用在方法上&#xff0c;方法返回的对象交给spring容器管理&#xff0c;和提供给其他程序组件使用 Bean是一个注解&#xff0c;用于将方法标记为Spring容器中的一个Bean。具体来说&#xff0c;Bean注解可以用于方法上&#xff0c…

Android 在程序运行时申请权限——以自动拨打电话为例

Android 6.0及以上系统在使用危险权限时必须进行运行时权限处理。 main_activity.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://sche…

Git 绑定账号 和clone

一:环境: 下载安装完成Git,在桌面或文件夹下(在你将要保存代码的位置)右击可以看到Git Bash Here,点击可以进入黑窗口 二:配置公钥 1.查看当前状态(如果已绑定,且知道密码可以登陆,可以直接获取SSH公钥并配置即可拉取代码) git config --list 2.配置全局git用户名和邮箱 …

使用Python搭建代理服务器- 爬虫代理服务器详细指南

搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP。下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器&#xff1a; 1. 首先&#xff0c;确保你已经安装了Python。你可以在官方网站(https://www.python.org/)下载并安装最新版本的Python。 2. 安…

c#中的Math.Ceiling和Math.floor()和Math.Round()

Math.Ceiling(),只要有小数就加1(小数部分不为0&#xff09; 例如&#xff1a; Math.Ceiling(0.0) -> 0 Math.Ceiling(0.1) -> 1 Math.Ceiling(0.2) -> 1 Math.Ceiling(0.3) -> 1 Math.Ceiling(0.4) -> 1 Math.Ceiling(0.5) -> 1 Math.Ceiling(0.6) -> 1…

WPF中Binding使用StringFormat格式化字符串方法

货币格式 <TextBlock Text"{Binding Price, StringFormat{}{0:C}}" /> // $123.46货币格式&#xff0c;一位小数 <TextBox Text"{Binding Price, StringFormat{}{0:C1}}" /> // $123.5前文字 <TextBox Text"{Binding Price, String…

本地Git仓库和GitHub仓库SSH传输

SSH创建命令解释 ssh-keygen 用于创建密钥的程序 -m PEM 将密钥的格式设为 PEM -t rsa 要创建的密钥类型&#xff0c;本例中为 RSA 格式 -b 4096 密钥的位数&#xff0c;本例中为 4096 -C “azureusermyserver” 追加到公钥文件末尾以便于识别的注释。 通常以电子邮件地址…

序列化模块pickle和json有什么区别

目录 什么是序列化模块pickle 什么是序列化模块json pickle和json有什么区别 总结 什么是序列化模块pickle pickle是Python中的内置模块&#xff0c;用于将Python对象序列化和反序列化为字节流。它提供了一种将复杂的数据结构&#xff08;如列表、字典、类实例等&#xff0…

练习时长两年半的入侵检测

计算机安全的三大中心目标是&#xff1a;保密性 (Conf idential ity) 、完整性 (Integrity) 、可用性 (Availability) 。 身份认证与识别、访问控制机制、加密技术、防火墙技术等技术共同特征就是集中在系统的自身加固和防护上&#xff0c;属于静态的安全防御技术&#xff0c;…

C++ Primer Plus 第6版 读书笔记(8)第 8章 函数探幽

第8 章 函数探幽 本章内容包括&#xff1a; 内联函数。引用变量。如何按引用传递函数参数。默认参数。函数重载。函数模板。函数模板具体化。通过第 7 章&#xff0c;您了解到很多有关 C函数的知识&#xff0c;但需要学习的知识还很多。C还提供许多新的函 数特性&#xff0c;…