观察者模式(Observer Pattern)

news/2024/9/18 1:10:44/ 标签: 设计模式, 观察者模式

一.定义

(一)观察者模式定义

  • 简介:观察者模式也叫做发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则其所有依赖于它的对象都会收到通知并自动更新。

1.Subject被观察者

  • 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责;
  • 职责管理观察者和通知观察者。

2.Observer观察者

  • 观察者接收到消息后,都进行update(更新)操作,对接收到的信息进行处理。

3.ConcreteSubject具体的被观察者

  • 定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

4.ConcreteObserver具体的观察者

  • 每个观察者收到消息之后的处理逻辑不同

(二)示例

1.观察者(Observer)

/*** 抽象观察者*/
public interface Observer {/*** 处理逻辑* @param ctx 接收数据上下文*/void dosomething(Object ctx);}

2.被观察者(Subject)

public abstract class Subject {//定义一个观察者集合private Set<Observer> obsSet = new CopyOnWriteArraySet<>();/*** 新增一个观察者* @param observer*/public void addObserver(Observer observer) {obsSet.add(observer);}public void deleteObserver(Observer observer) {obsSet.remove(observer);}/*** 通知观察者可以执行逻辑了* @param ctx*/public void notifyObserver(Object ctx) {for (Observer observer : obsSet) {observer.dosomething(ctx);}}}

3.具体被观察者(ConcreteSubject)

/*** 具体被观察者*/
public class ConcreteSubject extends Subject {public void dosomething(Object data) {//TODO 前置处理data相关逻辑,然后通知观察者super.notifyObserver(data);}
}

4.具体观察者(ConcreteObserver)

/*** 具体观察者*/
public class ConcreteObserver1 implements Observer {@Overridepublic void dosomething(Object data) {//TODO 观察者处理data逻辑System.out.println("observer1 handle data:" + data);}
}/*** 具体观察者*/
public class ConcreteObserver2 implements Observer {@Overridepublic void dosomething(Object data) {//TODO 观察者处理data逻辑System.out.println("observer2 handle data:" + data);}
}

5.高层模块使用

public class Invoker {public static void main(String[] args) {//创建一个被观察者ConcreteSubject subject = new ConcreteSubject();//定义观察者Observer observer1 = new ConcreteObserver1();Observer observer2 = new ConcreteObserver2();//添加观察者subject.addObserver(observer1);subject.addObserver(observer2);//执行subject.dosomething("data.data.");}
}

二.应用场景

【TODO】


http://www.ppmy.cn/news/1518585.html

相关文章

万龙觉醒游戏攻略辅助:VMOS云手机助力战场加速!自动战斗!

在《万龙觉醒》这款游戏中&#xff0c;使用VMOS云手机可以极大提升你的游戏体验。VMOS云手机为这款游戏专属定制了云手机版本&#xff0c;内置了游戏安装包&#xff0c;无需再次下载安装。通过VMOS云手机&#xff0c;你可以实现24小时不间断的云端游戏运行&#xff0c;彻底解放…

MySQL5.7.36之主从复制过滤复制-centos7

1、主库过滤复制(这种不常用) 在生产中在主库上面进行过滤设置,可能会造成数据丢失,无法恢复&#xff1b; 只要在主库的配置文件里面配置就行 binlog_do_dbdatabasename 2、从库过滤复制 从库设置过滤,DDL操作时,出现跨库操作,不会被sql_thread回放 第一步&#xff1a;停止…

【网络安全】服务基础第一阶段——第四节:Windows系统管理基础---- NTFS安全权限与SMB文件共享服务器

目录 一、NTFS安全权限 1.1 文件系统 1.2 格式化磁盘中的文件系统 1.FAT32 2.NTFS 3.EXT 4.XFS 应用场景&#xff1a; 1.3 文件操作权限 1.4 权限管理系统 1.5 特殊权限 1.6 NTFS权限类型 二、权限管理实践 三、SMB文件共享服务器 3.1 文件共享服务器 3.2 常用的…

数据结构代码分享

单向链表 slist.h #ifndef __SLIST_H #define __SLIST_H#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>// 定义单链表结构 typedef int DATA;typedef struct Node {DATA data; // 存储数据---数据域struct N…

英特尔 Arrow Lake Halo 再现,猛堆料对标Strix Halo/苹果M系列

原文转载修改自&#xff1a; Arrow Lake Halo暴力堆料&#xff0c;对标Strix Halo&#xff0c;M系列 根据最近的消息&#xff0c;蓝厂准备于来年1月推出笔记本Arrow Lake-H处理器。虽然在传闻中Arrow Lake-H又是Arc Alchemist架构革新&#xff0c;又是6P8E&#xff0c;但基于…

flutter封装Dio使用

原文地址 封装 DioHttpUtil 类 // ignore_for_file: constant_identifier_namesimport package:dio/dio.dart; import package:flutter/foundation.dart;

使用SparkGraphX进行图计算时的编码问题

使用SparkGraphX进行图计算时的编码问题 在SparkGraphX体系中&#xff0c;要求图网络中的点ID必须为Long类型&#xff0c;不像Python中的networkX工具包支持字符串类型的节点表示&#xff0c;但在现实场景中&#xff0c;有很多情况下&#xff0c;点ID都是字符串类型的&#xf…

网络原理 TCP与UDP协议

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1.应用层 之前编写完了基本的 java socket &#xff0c;要知道&#xff0c;我们之前所写的所有代码都在应⽤层&#xff0c;都是为了 完成某项…

Ubuntu18.04 下安装CUDA

安装步骤 1.查看是否安装了cuda # 法1 cat /usr/local/cuda/version.txt # 法2 nvcc --version 2.若没有安装&#xff0c;则查看是否有N卡驱动&#xff0c;若无N卡驱动&#xff0c;则到软件与更新 -> 附加驱动中安装驱动 3.查看N卡驱动支持的cuda版本 nvidia-smi 如下…

哪些领域最适合采用音视频私有化解决方案?

随着数字化时代的到来&#xff0c;音视频通信已成为各行各业不可或缺的一部分&#xff0c;从企业内部沟通到在线教育、远程医疗、金融交易等&#xff0c;无一不依赖于稳定、高效且安全的音视频技术。然而&#xff0c;不同的行业对音视频通信的需求各不相同&#xff0c;尤其在数…

微信小程序代码目录结构介绍

文件描述app.js小程序的入口文件&#xff0c;负责监听和处理小程序的生命周期函数&#xff0c;以及定义一些全局的公共方法和数据。app.json公共全局配置文件。app.wxss公共全局样式文件。project.config.json项目的配置文件&#xff0c;包含一些项目级别的配置&#xff0c;如项…

使用Vue创建cesium项目模版该如何选择?

目录 问题描述模版说明及选用建议小结 问题描述 刚入手这个项目&#xff0c;什么都是一知半解。使用Vue,创建Cesium项目的时候&#xff0c;提示需要选择一个模版&#xff08;如下图所示&#xff09;&#xff0c;该如何选择项目模版选&#xff0c;总结如下&#xff1a; 模版说明…

Django+Vue音乐推荐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

Java基础入门【第六章 static、继承、重写、多态】(二)

5.访问控制 对象中的属性和方法&#xff0c;可以根据不同的权限修饰符&#xff08;public > protected > default > private&#xff09;来进行访问控制。 1&#xff09;概述 类中的属性和方法&#xff0c;可以使用以下四种权限修饰符进行访问控制&#xff1a; pu…

python列表实现矩阵行列转换

本文采用列表嵌套实现矩阵的行列转换。 第一种方法&#xff08;此方法来源于https://docs.python.org/zh-cn/3/tutorial/datastructures.html#list-comprehensions matrix [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], ] print([[row[i] for row in matrix] for i i…

回归预测|基于粒子群优化核极限学习机PSO-KELM结合Adaboost集成的数据预测Matlab程序 多特征输入单输出

回归预测|基于粒子群优化核极限学习机PSO-KELM结合Adaboost集成的数据预测Matlab程序 多特征输入单输出 文章目录 一、基本原理1. 数据预处理2. PSO优化&#xff08;粒子群优化&#xff09;3. KELM训练&#xff08;核极限学习机&#xff09;4. AdaBoost集成5. 模型评估和优化6.…

【C语言】深入理解指针(四)qsort函数的实现

指针4 1.回调函数是什么2.qsort使用举例3.qsort函数的模拟实现 1.回调函数是什么 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另⼀个函数&#xff0c;当这个指针被⽤来调⽤其所指向的函数 时&#xff0c;被调⽤的…

C语言初阶 --- 数据在内存中的存储

&#x1f388; 个人主页&#x1f449;&#xff1a;tbRNA-CSDN博客 &#x1f4af; 个人简介&#xff1a;在校大学生一枚&#x1f48b;. &#x1f60d; 希望我的文章对大家有着不一样的帮助&#xff0c;欢迎大家关注我&#xff0c;感谢大家的多多支持&#xff01; &#x1f389; …

【ragflow】安装2:源码安装依赖

中文文档【ragflow】安装1: docker:失败官方说的成功 docker 安装的启动失败 重新来一遍,不会重新拉取: root@k8s-master-pfsrv:/home/zhangbin/perfwork/rag# cd ragflow/ root@k8s-master-pfsrv:/home/

互联网应用主流框架整合之Spring缓存机制和Redis结合

Redis和数据库的结合 在实际的商用软件使用中,通常都是Redis和关系型数据配置使用,单纯使用Redis来存数据成本太高,并且其持久化和计算能力偏差,这两块无法和关系型数据相比较,而Redis和关系型数据库共存的场景就会带来另一个问题,就是在两者之间的数据一致性的问题,有…