当前位置: 首页 > news >正文

探索设计模式:观察者模式

探索设计模式:观察者模式

    • 🧐观察者模式简介
    • :gem:核心概念
    • :rainbow:观察者模式的优点
    • :truck:实现步骤
      • 1. 定义主题接口
      • 2. 实现观察者接口
      • 3. 具体主题实现
      • 4. 具体观察者实现
      • 5. 调用
    • :triangular_flag_on_post:总结

在这里插入图片描述

  在实际开发过程中,设计模式的作用是非常重要的,应用合适的设计模式不仅仅可以减少我们的代码量,也可以让我们的代码质量上升一个层次。今天让我们一起投袂而起,一起学习一下观察者模式(Observer Pattern)。

🧐观察者模式简介


  观察者模式是一种行为型 设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,会自动通知所有注册的观察者对象,从而它们能够自动更新自己。最常见的场景就是B站up主和粉丝的关系,up主发布新视频,每一个粉丝都会收到消息,这就是因为使用了观察者模式。

使用场景

  1. 消息发布/订阅系统
  2. 用户界面组件
  3. 股票市场监控
  4. 事件驱动系统

💎核心概念


  在观察者模式中,主要有两个核心角色:

  • 主题(Subject):也被称为被观察者,它维护一个观察者列表,当其状态发生变化时,会通知所有注册的观察者。
  • 观察者(Observer):监听主题对象状态变化,一旦主题状态发生变化,观察者会收到通知并做出相应的处理。

在这里插入图片描述

🌈观察者模式的优点


  • 低耦合性:主题和观察者之间的依赖关系被最小化,两者可以独立变化。
  • 动态性:可以在运行时动态地添加或删除观察者,使得系统更加灵活。
  • 响应性:观察者可以实时响应主题的变化,保证了系统的实时性和高效性。

🚚实现步骤


接下来,我们将通过以下步骤来实现一个简单的观察者模式:

1. 定义主题接口


  确定主题需要提供的方法,如注册观察者、移除观察者和通知观察者。

public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String message);}

2. 实现观察者接口


  观察者需要定义一个更新接口,以便在主题状态变化时被调用。

public interface Observer {void update(String message);}

3. 具体主题实现


  实现主题接口,管理观察者列表,并在适当的时候通知观察者。

public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();@Overridepublic void registerObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}}

4. 具体观察者实现


  实现观察者接口,定义在自己的更新行为。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ConcreteObserver implements Observer {private String name;@Overridepublic void update(String message) {System.out.println(this.name + "收到了通知 : " + message);}}

5. 调用


public class ObserverPatternClient {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver("张三");Observer observer2 = new ConcreteObserver("李四");subject.registerObserver(observer1);subject.registerObserver(observer2);subject.notifyObservers("Hello, world!");}
}

在这里插入图片描述

🚩总结


在这里插入图片描述

  观察者模式作为一种经典的设计模式,其核心在于解耦,它允许对象之间的松散耦合,使得它们可以独立地改变和复用。通过本文的深入剖析,我们了解到观察打折模式不仅能够提高系统的可维护性和可扩展性,还能够增强系统的响应性和灵活性。在实际开发过程中,当我么面临对象间一对多的关系,且一方对象的状态变化需要通知多方对象时,观察者模式便是一个理想的解决方案。

相关文章:

探索设计模式:观察者模式

探索设计模式&#xff1a;观察者模式 &#x1f9d0;观察者模式简介:gem:核心概念:rainbow:观察者模式的优点:truck:实现步骤1. 定义主题接口2. 实现观察者接口3. 具体主题实现4. 具体观察者实现5. 调用 :triangular_flag_on_post:总结 在实际开发过程中&#xff0c;设计模式的作…...

gradio之持续输入,持续输出(流式)

流式输出yield,比如一个输出控件&#xff0c;想要实时显示内容&#xff0c;用return for循环一次就返回去了。而用yield会持续更新往下执行 for i in range(length):time.sleep(8)yield 总共str(length)条语料&#xff0c;已运行str(i1)条 在Gradio中&#xff0c;某些组件&am…...

Git 常用命令指南:从入门到精通

文章目录 前言1. 初始化一个Git仓库2. 克隆远程仓库3. 查看仓库状态4. 添加文件到暂存区5. 提交代码6. 推送到远程仓库7. 拉取远程仓库的更改8. 分支管理9. 查看提交历史10. 回退到某个版本结语 前言 如果你是一位开发者或者对代码感兴趣&#xff0c;那么你一定听说过Git。Git…...

Camera驱动 汇总表【小驰行动派】

在做Camera BringUp的时候&#xff0c;如果有已经点亮过的驱动源码&#xff0c;对我们的帮助将会非常的大&#xff0c;可以大大加快我们点亮进度。 所以我决定整理汇总接触过得Camera驱动信息。如果你刚好有需要&#xff0c;可以加我薇咨询&#xff08;该资料整理比较花时间&a…...

SSRS rdlc报表 九 在.net core中使用RDLC报表

开发环境 vs 2022企业版 SqlServer数据库 Win11 前言 rdlc报表在aspx中集成的很好,很容易实现,并且功能强大,但随着技术的发展,aspx慢慢的被淘汰,现在已经发展到.net8了,aspx基本上很少用,出的新框架基本上也都是前后端分离,没了aspx的控件加持,rdlc这么厉害的报…...

力扣(2024.08.10)

1. 222&#xff1a;完全二叉树的节点个数 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def countNodes(…...

Django-文件上传

## Django文件上传需要考虑的重要事项 > 文件或图片一般通过表单进行。用户在前端点击文件上传&#xff0c;然后以POST方式将数据和文件提交到服务器。服务器在接收到POST请求后需要将其存储在服务器上的某个地方。Django默认的存储地址是相对于根目录的/media/文件夹&…...

[Meachines] [Easy] valentine SSL心脏滴血+SSH-RSA解密+trp00f自动化权限提升+Tmux进程劫持权限提升

信息收集 IP AddressOpening Ports10.10.10.79TCP:22,80,443 $ nmap 10.10.10.79 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 1024 96:4c:51:42:…...

利用单张/多张图内参数标定 OpenCV Python

E:\OpenCV_py_ws\opencv相机标定\图片\calib-JT.py #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2023/11/21 16:05 # @File : calib.py # @Software: import cv2 import numpy as np import glob from datetime import datetimenp.set_printoptions(supp…...

The Llama 3 Herd of Models 第7部分视觉实验部分全文

第1,2,3部分,介绍、概览和预训练 第4部分,后训练 第5部分,结果 第6部分,推理 7 Vision Experiments 我们进行了一系列的实验,在这些实验中,我们通过一种由两个主要阶段组成的合成方法将视觉识别能力整合到Llama 3中。首先,我们通过在大量图像-文本对上引入和训练两种…...

亚信安慧AntDB-T:使用Brin索引提升OLAP查询性能以及节省磁盘空间

前 言 在这个信息量爆炸的时代&#xff0c;数据库面临着海量数据的挑战&#xff0c;如何提升OLAP业务的查询性能、如何节省磁盘空间等问题已经成为了数据库的痛点之所在。本篇着重介绍亚信安慧AntDB-T中Brin索引的实现过程以及应用在OLAP业务中带来的性能提升和存储降低。 亚…...

web渗透测试常用命令

Web Application TTPs HPING3 DoS hping3 targetiP --flood --frag --spoof ip --destport # --synHydra Online Brute Force hydra -1 ftp -P words -v targetiP ftpDownload HTTP File and Execute...

Kylin系列(二)使用

接上一章《Kylin系列(一)入门》 1. Kylin使用 1.1. 数据准备 1.1.1. 数据导入 在使用Apache Kylin时,数据导入是一个非常重要的环节,因为它直接影响到Kylin的性能、稳定性和易用性。以下是关于Apache Kylin数据导入的一些详细介绍: 导入数据的准备 在开始导入数据之前…...

CI/CD——CI持续集成实验

目录 一. 安装Docker 二. 部署Jenkins 三. 配置邮箱 四. Harbor部署 五. Nexus Repository部署 五. sonarqube安装 六. 配置Docker 七. jenkins系统配置sonarqube 八. 配置pipeline 九. 构建并集成 一. 安装Docker docker-ce镜像_docker-ce下载地址_docker-ce安装教程…...

2.4 大模型数据基础:预训练阶段数据详解 ——《带你自学大语言模型》系列

​本系列目录 《带你自学大语言模型》系列部分目录及计划&#xff0c;完整版目录见&#xff1a;带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型&#xff08;科普向&#xff09; 第一章 走进大语言模型 1.1 从图灵机到GPT&#xff0c;人工智能经历了什么&#xf…...

Kali Linux——网络安全的瑞士军刀

一、引言 在网络安全的领域中&#xff0c;Kali Linux 宛如一把强大而全能的瑞士军刀&#xff0c;为安全研究人员和专业人士提供了丰富的工具和资源。本文将深入探讨 Kali Linux 的特点、优势、常用工具以及实际应用场景&#xff0c;带您领略这一强大操作系统的魅力。 二、Kal…...

UML建模-测试用例

用例可用于测试系统的正确性和有效性。 正确性表明系统的实现符合规格说明。有效性保证开发的系统是用户真正需要的系统。有效性检查一般在 系统开发之前进行。当用例模型构造完成后&#xff0c;开发者将模型交给用户讨论&#xff0c;由用户检查模型能否满足他们对系统的需求。…...

Python知识点:如何使用Socket模块进行网络编程

Python 的 socket 模块提供了一个底层网络接口&#xff0c;允许你通过编程进行网络通信。使用 socket 模块可以编写客户端和服务器端程序&#xff0c;从而实现数据在网络上的传输。以下是如何使用 socket 模块进行网络编程的详细说明。 1. 创建一个 Socket 首先&#xff0c;你…...

培训第二十一天(mysql用户创建与授权、角色创建)

上午 1、环境准备 [rootmysql ~]# rm -rf /etc/my.cnf //清空/etc目录下的my.cnf[rootmysql ~]# yum -y remove mariadb //移除mariadb[rootmysql ~]# find / -name "*mysql*" -exec rm -rf {} \; //删除mysql所有遗留文件 2、安装mysql绿包 [rootmysql ~]…...

makefile基本语法

在编写复杂的程序项目时&#xff0c;Makefile 是一个非常有用的工具&#xff0c;它能自动化构建过程。以下是一些基本的 Makefile 语法介绍&#xff1a; 基本结构&#xff1a; target: dependenciescommandtarget&#xff1a;构建目标&#xff0c;通常是一个文件&#xff0c;如…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...