【设计模式-观察者模式】

news2024/11/16 23:56:53

定义

观察者模式(Observer Pattern)是一种行为型设计模式,用于定义一对多的依赖关系,让多个观察者对象同时监听某一个主题对象(被观察者)的状态变化当主题状态发生变化时,所有依赖于它的观察者都会收到通知并自动更新

UML图

在这里插入图片描述

  • Subject(主题/被观察者):定义了可以注册、注销观察者的方法,以及通知观察者的逻辑。
  • Observer(观察者):定义了一个更新接口,当被观察者状态发生变化时,观察者会通过该接口更新自己。
  • ConcreteSubject(具体主题):实现主题接口,维护观察者的列表,并在状态变化时通知观察者。
  • ConcreteObserver(具体观察者):实现观察者接口,定义在主题状态变化时的具体行为。

工作流程

  1. 观察者通过主题对象注册自己,以便接收更新。
  2. 主题对象在状态变化时调用观察者的更新方法。
  3. 观察者根据主题的最新状态进行相应的更新操作。

代码

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

// 观察者接口
interface Observer {
    void update(String message);
}

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主题类
class NewsAgency implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String news;

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(news);
        }
    }

    public void setNews(String news) {
        this.news = news;
        notifyObservers(); // 状态变化时通知所有观察者
    }
}

// 具体观察者类
class NewsChannel implements Observer {
    private String name;

    public NewsChannel(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received news update: " + message);
    }
}

// 测试观察者模式
public class ObserverPatternDemo {
    public static void main(String[] args) {
        NewsAgency newsAgency = new NewsAgency();
        
        NewsChannel channel1 = new NewsChannel("Channel 1");
        NewsChannel channel2 = new NewsChannel("Channel 2");

        newsAgency.registerObserver(channel1);
        newsAgency.registerObserver(channel2);

        newsAgency.setNews("Breaking News: Observer Pattern Explained!");
        newsAgency.setNews("More News: Observer Pattern in Action!");
    }
}

优点

  • 解耦:观察者和主题之间的耦合度低,主题不需要了解观察者的具体实现。
  • 动态添加观察者:可以在运行时动态地添加和移除观察者,灵活性高。
  • 广播机制:一个主题可以有多个观察者,状态变化时可以一并通知所有观察者。

缺点

  • 可能导致内存泄漏:如果观察者没有被正确注销,可能会造成内存泄漏。
  • 通知顺序不确定:多个观察者的更新顺序不固定,可能会导致状态不一致。
  • 复杂性增加:在复杂系统中,观察者和主题之间的关系可能变得难以管理和调试。

适用场景

  • 事件处理系统:如 GUI 事件监听,用户操作触发相应的事件。
  • 发布/订阅系统:如消息队列、社交媒体的通知系统等。
  • 数据变化监测:如实时数据监控、股票价格更新等。

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

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

相关文章

00DSP学习-F28379D学习准备(了解一个工程的构成)

叠甲 我也算初学F28379D&#xff0c;不对之处请大家斧正。不同型号的DSP在外设配置的函数上有一些区别&#xff0c;但是掌握一种对其他型号的来说则难度不大。对于我们而言学习DSP最终还是要用于算法验证&#xff0c;而DSP资源的最大化利用、代码效率提升等则是后话。 软件准…

大数据-146 Apache Kudu 安装运行 Dockerfile 模拟集群 启动测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

进阶SpringBoot之分布式系统与 RPC 原理

分布式系统是若干独立计算机的集合&#xff0c;这些计算机对于用户来说就像单个相关系统 分布式系统是由一组通过网络进行通信&#xff0c;为了完成共同的任务而协调工作的计算机节点组成的系统 其目的是利用更多的机器&#xff0c;处理更多的数据 RPC&#xff08;Remote Pr…

【Day20240924】05git 两人协作 冲突

git 两人协作 冲突 命令行解决 两个人修改同一文件时 的冲突可视化解决 两个人修改同一文件时 的冲突参考 命令行解决 两个人修改同一文件时 的冲突 假设kerwin.js是项目的路由文件。tiechui文件夹是组员铁锤的工作目录&#xff1b;test2008文件夹是组长的工作目录。此时&…

JAVA基本简介(期末)

1、JDK JRE JVM &#xff08;1&#xff09;JDK JAVA标准开发包&#xff0c;提供了编译、运行JAVA程序所需的各种工具和资源&#xff0c;包括JAVA编译器、JAVA运行时的环境&#xff0c;及常用的JAVA类库等 &#xff08;2&#xff09;JRE JAVA运行环境&#xff0c;用于解释执行JA…

CNAS软件检测实验室信息安全性测试作业指导书编写指南

CNAS软件检测实验室在申请信息安全领域测试的相关资质时&#xff0c;需要按照GB/T 25000.51-2016《软件产品质量要求和测试细则》标准中的方法&#xff0c;编写作业指导书&#xff0c;指导软件检测实验室内部信息安全性测试的开展。CNAS软件检测实验室信息安全性测试作业指导与…

风力发电机叶片表面缺陷识别检测数据集yolo数据集 共7000张

风力发电机叶片表面缺陷识别检测数据集yolo数据集 共7000张 风力发电机叶片表面缺陷识别数据集&#xff08;Wind Turbine Blade Defects Recognition Dataset, WTBDRD&#xff09; 摘要 WTBDRD 是一个专门为风力发电机叶片表面缺陷识别而设计的数据集&#xff0c;旨在为相关领…

【目标检测】隐翅虫数据集386张VOC+YOLO

隐翅虫数据集&#xff1a;图片来自网页爬虫&#xff0c;删除重复项后整理标注而成 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;386 标注…

Oracle逻辑备份脚本【生产环境适用】

1 说明 从Oracle10g开始&#xff0c;引入了数据泵&#xff08;Data Pump&#xff09;&#xff0c;是一种高效的数据传输工具&#xff0c;它通过导出&#xff08;Export&#xff09;和导入&#xff08;Import&#xff09;的方式帮助用户迁移数据。 在Oracle的产品设计中&#…

IntraWeb开发Web网站时对数据库“增、删、改、查”的操作

delphi源代码&#xff1a;示例两列布局带顶部汉堡菜单&#xff0c;对数据库“增、删、改、查”的操作&#xff08;兼容电脑与手机&#xff09; 功能&#xff1a;交互式网页&#xff0c;两列布局&#xff0c;顶部汉堡菜单&#xff0c;点击汉堡图标关闭左侧栏&#xff0c;这里演示…

责任链模式优化 文章发布的接口(长度验证,敏感词验证,图片验证等环节) 代码,示例

需求&#xff1a;后端需要提供一个文章发布的接口&#xff0c;接口中需要先对文章内容进行如下校验&#xff0c;校验通过后才能发布 1. 文章长度不能超过1万个字符 2. 不能有敏感词 3. 文章中图片需要合规 责任链相当于一个链条一样&#xff0c;链条上有很多节点&#xff0c;节…

Flask学习之项目搭建

一、项目基本结构 1、 exts.py 存在的目的&#xff1a;在Python中&#xff0c;如果两个或更多模块(文件)相互导入对方&#xff0c;就会形成导入循环。例如&#xff0c;模块A导入了模块B&#xff0c;同时模块B又导入了模块A&#xff0c;这就会导致导入循环。 比如在这个项目中…

拦截器filter

使用拦截器对请求进行拦截&#xff0c;查看请求头是否携带token 可以看到&#xff0c;拦截器引入了web的依赖 前端的请求会经过网关&#xff08;gateway&#xff09;&#xff0c;网关用的是netty服务器&#xff0c;会和web默认的tomcat服务器冲突&#xff0c;但是前端过来的请求…

SMTP/IMAP服务发在线邮件时要用到

SMTP/IMAP服务 require PHPMailerAutoload.php; // 或 require class.phpmailer.php;// 创建实例 $mail new PHPMailer();// 设定邮件服务器 $mail->isSMTP(); $mail->Host smtp.example.com; // 邮件服务器地址 $mail->SMTPAuth true; $mail->Username your…

Golang | Leetcode Golang题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; func countSegments(s string) (ans int) {for i, ch : range s {if (i 0 || s[i-1] ) && ch ! {ans}}return }

Redis面试笔记

1.什么是Redis 简单来说 redis 就是一个数据库&#xff0c;不过与传统数据库不同的是 redis 的数据是存在内存中的&#xff0c;所以读写速度非常快&#xff0c;因此 redis 被广泛应用于缓存方向。另外&#xff0c;redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持…

如何在算家云搭建DiffSynth-Kolors-Painter(图像生成)

一、DiffSynth-Kolors-Painter简介 DiffSynth 画板提供了 Prompt 分区控制技术&#xff0c;可以通过创建图层、调整不同的提示&#xff08;Prompt&#xff09;精细地控制画面的每一部分&#xff0c;影响画面的特定区域&#xff0c;从而实现对画面的精细操控&#xff0c;实现了…

LobeChat:使用服务端数据库部署 - Docker+NextAuth(github)+腾讯云

总流程 Docker部署 身份验证服务-NextAuth github S3存储服务 腾讯云COS 1. 安装Docker brew install docker --cask2. 创建pgvector容器(PostgresSQL) docker run --name [myPgvector] -p 5432:5432 -e POSTGRES_PASSWORD[pwd] -d -e POSTGRES_USER[username] pgvector/…

MySQL—存储过程详解

基本介绍 存储过程和函数是数据库中预先编译并存储的一组SQL语句集合。它们的主要目的是提高代码的复用性、减少数据传输、简化业务逻辑处理&#xff0c;并且一旦编译成功&#xff0c;可以永久有效。 存储过程和函数的好处 提高代码的复用性&#xff1a;存储过程和函数可以在…

【NPL】daydayup基本概念,词嵌入

NLP基础 基本概念 NLP&#xff0c;自然语言处理&#xff0c;目标是让计算机能够理解、解释、生成人类语言的数据。包括语言理解&#xff0c;语言生成&#xff0c;机器翻译&#xff0c;情感分享&#xff0c;语音识别&#xff0c;语音合成等 应用方向 自然语言理解 情感分析&a…