Java实现观察者模式

一、前言

观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。

二、具体实现

1、发布订阅案例

观察者接口:

/**
 * @Description: 观察者接口
 * @Date: 2024-12-27 10:08
 * @Author: gaoyufei
 **/
public interface Observer {
    void accept(String message);
}

观察者实现:

/**
 * @Description: 订阅者
 * @Date: 2024-12-27 10:10
 * @Author: gaoyufei
 **/
public class Subscriber implements Observer{
    public String clientId;
    public Subscriber(String clientId){
        this.clientId=clientId;
    }
    @Override
    public void accept(String message) {
        System.out.println("订阅者:"+clientId+" 接受到消息:"+message);
    }
}

主题接口:

/**
 * @Description: 主题接口
 * @Date: 2024-12-27 10:15
 * @Author: gaoyufei
 **/
public interface Subject {
    void add(Observer observer);
    void del(Observer observer);
    void notify(String message);
}

主题实现:

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

/**
 * @Description: 主题,维护了订阅者列表,通知订阅者
 * @Date: 2024-12-27 10:16
 * @Author: gaoyufei
 **/
public class Topic implements Subject {
    private List<Observer> observerList=new ArrayList<>();
    @Override
    public void add(Observer observer) {
        observerList.add(observer);
    }
    @Override
    public void del(Observer observer) {
        observerList.remove(observer);
    }
    @Override
    public void notify(String message) {
        observerList.stream().forEach(e->{
            e.accept(message);
        });
    }
}

模拟订阅者订阅主题,客户端发布消息:

/**
 * @Description: 模拟订阅者订阅主题,客户端发布消息
 * @Date: 2024-12-27 10:18
 * @Author: gaoyufei
 **/
public class Client {
    public static void main(String[] args) {
        Topic topic=new Topic();
        Subscriber subscriber1=new Subscriber("001");
        Subscriber subscriber2=new Subscriber("002");
        Subscriber subscriber3=new Subscriber("003");
        topic.add(subscriber1);
        topic.add(subscriber2);
        topic.add(subscriber3);
        topic.notify("您有一条新消息!");
    }
}

2、村长通知村民案例

观察者接口:

/**
 * @Description: 观察者接口
 * @Date: 2024-12-27 9:35
 * @Author: gaoyufei
 **/
public interface Observer {
    void accept(String message);
}

观察者具体观察者村民:

/**
 * @Description: 具体观察者,村民,能接受消息
 * @Date: 2024-12-27 9:37
 * @Author: gaoyufei
 **/
public class Resident implements Observer{
    private String name;
    public Resident(String name){
        this.name=name;
    }
    @Override
    public void accept(String message) {
        System.out.println("村民:"+this.name+"  收到信息:"+message);
    }
}

抽象主题:

/**
 * @Description: 抽象主题
 * @Date: 2024-12-27 9:39
 * @Author: gaoyufei
 **/
public interface Subject {
    void add(Observer observer);
    void del(Observer observer);
    void notify(String message);
}

主题的具体实现,村长的记录本:

import java.util.ArrayList;
import java.util.List;
/**
 * @Description: 主题的具体实现,村长的记录本,维护了村民信息,村长可以通过记录本给村民群发信息
 * @Date: 2024-12-27 9:42
 * @Author: gaoyufei
 **/
public class RecordBook implements Subject {
    private List<Observer> observerList = new ArrayList<>();
    @Override
    public void add(Observer observer) {
        observerList.add(observer);
    }
    @Override
    public void del(Observer observer) {
        observerList.remove(observer);
    }
    @Override
    public void notify(String message) {
        observerList.stream().forEach(e -> {
            e.accept(message);
        });
    }
}

村长登记村民信息,用记录本给村民群发信息:

/**
 * @Description: 村长登记村民信息,用记录本给村民群发信息
 * @Date: 2024-12-27 9:44
 * @Author: gaoyufei
 **/
public class VillageHead {
    public static void main(String[] args) {
//        1、村里,村长有一个记录村民电话的本子,村民都需要登记一下。
//        在村里有什么事情的时候,村长就通过群发消息的方式通知村民。
//        2、村民就是观察者、订阅者,村长发布信息,记录本就是主题,
        RecordBook recordBook=new RecordBook();
        Resident resident=new Resident("王满银");
        Resident resident1=new Resident("孙玉亭");
        Resident resident2=new Resident("孙玉厚");
        recordBook.add(resident);
        recordBook.add(resident1);
        recordBook.add(resident2);
        recordBook.notify("大家好,今天下午三点来村支部开会,有重要事情通知!");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue多页面路由与模版解析

上篇文章中我们成功打包并输出了多页文件&#xff0c;而构建一个多页应用能够让我们进一步了解项目配置的可拓展性&#xff0c;可以对学习 Vue 和 webpack 起到强化训练的效果&#xff0c;本文将在此基础上主要针对多页路由及模板的配置进行系列的介绍。 路由配置 1. 跳转 在…

UE5材质节点SimpleGrassWind

SimpleGrassWind节点可以模拟树叶扰动&#xff0c;或小草晃动效果 用来做风格化树、风格化草效果很好 主要节点 前三个节点分别用来控制&#xff0c;风强度&#xff0c;风重力&#xff0c;风速度&#xff0c;WPO是世界位置偏移

macrodroid通过http请求控制手机运行宏

macrodroid adb命令 adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS例:http请求手机播放指定MP3文件 声音素材_电量过低提醒 新建一个宏 添加触发器-连接-http服务器请求 路径随意填,最好不要有特殊符号,不然浏览器识别链接会出错,…

单片机中运行多个定时器

在单片机的裸机编程环境中&#xff0c;同时运行多个定时器是完全可行的&#xff0c;但需要注意一些关键点以确保系统的稳定性和效率。以下是一些考虑因素和实现方法&#xff1a; 1. 硬件支持 定时器数量&#xff1a;首先确认您的单片机是否具备足够的定时器资源。大多数现代…

快速上手LangChain(一)

文章目录 LangChain一、背景二、什么是langchain三、Components 组件Prompt templates 提示模板Chat models 聊天模型Messages 消息Document loadersText Spltters 文本分割Vectorstores 向量数据库 四、langchain基础概念Tool calling 工具调用&#xff08;1&#xff09; 工具…

大模型Weekly 03|OpenAI o3发布;DeepSeek-V3上线即开源!

大模型Weekly 03&#xff5c;OpenAI o3发布&#xff1b;DeepSeek-V3上线即开源&#xff01;DeepSeek-V3上线即开源&#xff1b;OpenAI 发布高级推理模型 o3https://mp.weixin.qq.com/s/9qU_zzIv9ibFdJZ5cTocOw?token47960959&langzh_CN 「青稞大模型Weekly」&#xff0c;持…

记录一下图像处理的基础知识

记录一下自己学习的图像处理的基础知识。 一、图像的文件格式以及常用的图像空间 1、文件格式 常见的图像文件格式有 jpg, png, bmp, gif &#xff08;1&#xff09;jpg&#xff1a;有损压缩算法&#xff0c;大幅减小文件大小&#xff0c;便于存储和传输&#xff0c;兼容性…

时间敏感网络中全面分析与调度的模型驱动方法

论文&#xff1a;A Model-Driven Approach for the Comprehensive Analysis and Scheduling in Time-Sensitive Networks》 背景与动机 TSN 的发展与应用领域&#xff1a;自 2012 年起&#xff0c;IEEE 802.1 TSN 任务组致力于开发通信标准&#xff0c;增强 IEEE 802 网络&…

QT---------GUI程序设计基础

代码UI化设计&#xff08;QT&#xff09; 实例功能概述 假设我们要创建一个简单的计算器应用程序。该应用程序具有以下功能&#xff1a; 包含数字按钮&#xff08;0-9&#xff09;、操作符按钮&#xff08;、-、*、/&#xff09;、等于按钮&#xff08;&#xff09;和清除按…

大模型提示词初探

大模型提示词初探 在与大模型交互的过程中&#xff0c;提示词起着至关重要的作用&#xff0c;它犹如给模型下达的精准任务指令&#xff0c;直接影响着模型生成内容的准确性、高效性与合理性。合理运用提示词&#xff0c;能够有效减少模型出现错误和幻觉的情况&#xff0c;从而…

Navicat 连接 SQL Server 详尽指南

Navicat 是一款功能强大的数据库管理工具&#xff0c;它提供了直观的图形界面&#xff0c;使用户能够轻松地管理和操作各种类型的数据库&#xff0c;包括 SQL Server。本文将详尽介绍如何使用 Navicat 连接到 SQL Server 数据库&#xff0c;包括安装设置、连接配置、常见问题排…

【Linux】进程间通信-> 共享内存

共享内存原理 在C语言/C中&#xff0c;malloc也可以在物理内存申请空间&#xff0c;将申请的物理内存空间通过页表映射到进程地址空间&#xff0c;将内存空间的起始地址&#xff08;虚拟地址&#xff09;返回&#xff0c;进而进程可以使用虚拟地址通过页表映射到物理内存的方式…

高仿CSDN编辑器,前端博客模板

高仿CSDN编辑器纯前端模板&#xff0c;使用的js、html、vue、axios等技术&#xff0c;网络请求库已进行封装&#xff0c;可以按需调整界面,需要源码联系(4k左右)。 1.支持代码高亮 2.支持目录点击定位 3.支持文件上传、图片上传&#xff08;需要自己写后端接口&#xff09; 4.M…

国产低代码框架zdppy开发笔记002 标准的接口响应

前言 通过前面的学习, 我们已经知道了zdppy_api和zdppy_req的基本用法, 接下来我们会在学习中多次用到这两个框架. 我们已经知道了该如何响应一个字符串,但是我们该如何响应json数据呢? 在zdppy_api中,我们定义了一组规范的API响应, 我们慢慢来看看. 规范的响应 首先来看…

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

牛客周赛 Round 74

D. 预知 题目链接 题意有点绕&#xff0c;简单来说是其中一堆牌&#xff0c;问最少预知几张才能保证任取两张都不会导致种类重复。一开始对每张牌种类不是已知的&#xff0c;已知的是每种牌的牌数。 思路就是相当于把其中一种明牌&#xff0c;保证任取两张都不会导致种类重复…

【linux学习指南】SIGCHLD信号

文章目录 &#x1f4dd;SIGCHLD信号&#x1f6a9;总结 &#x1f4dd;SIGCHLD信号 进程⼀章讲过⽤wait和waitpid函数清理僵⼫进程,⽗进程可以阻塞等待⼦进程结束,也可以⾮阻塞地查询是否有⼦进程结束等待清理(也就是轮询的⽅式)。采⽤第⼀种⽅式,⽗进程阻塞了就不能处理⾃⼰的⼯…

AI助力SEO优化的关键词策略解析

内容概要 在数字营销的快速发展中&#xff0c;人工智能&#xff08;AI&#xff09;正逐步成为提升搜索引擎优化&#xff08;SEO&#xff09;效果的重要工具。关键词策略是SEO成功的关键要素之一&#xff0c;而AI技术的应用使得这一过程更加高效和精准。在关键词研究中&#xf…

PHP-Casbin v4.0.0 发布,支持 ACL、RBAC、ABAC 等模型的访问控制框架

PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架&#xff0c;支持 ACL、RBAC、ABAC 多种模型。它采用了元模型的设计思想&#xff0c;支持多种经典的访问控制方案&#xff0c;如基于角色的访问控制 RBAC、基于属性的访问控制 ABAC 等。 更新内容&#xff1a; http…

解决Git中没有小绿勾与红叉叉的问题

一、检查自己的软件 必须安装Git和Tortoisegit&#xff08;也就是俗称的小乌龟&#xff09;这两个软件。 Git的下载地址&#xff1a; CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 寻找与自己电脑相配的软件版本就可以了。 Tor…