设计模式之观察者模式ObserverPattern(十一)

一、概述

        观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

二、结构

在观察者模式中有如下角色:

  • Subject:观察对象,定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在的状态”的方法。
  • ConcreteSubject:具体观察对象,当自身状态发生变化后,它会通知所有已经注册的 Observer 角色。
  • Observer:抽象观察者,负责接收来自 Subject 角色的状态变化的通知,为此,它声明了 update 方法。
  • ConcrereObserver:具体观察者,当它的 update 方法被调用后,会去获取要观察的对象的最新状态。

三、代码实现

1、Observer

package com.xu.demo.observerPattern;

/**
 * 观察者接口
 */
public interface Observer {

    void update(String message);
}

2、ConcreteObserver

 

package com.xu.demo.observerPattern;

/**
 * 观察者实例
 */
public class ConcreteObserver implements Observer{

    private String name;

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

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

3、Subject

package com.xu.demo.observerPattern;

/**
 * 主题接口
 */
public interface Subject {

    //添加订阅者(观察者对象)
    void attach(Observer observer);

    //删除订阅者
    void detach(Observer observer);

    //通知订阅者更新消息
    void notify(String message);
}

4、SubscriptionSubject

 

package com.xu.demo.observerPattern;

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

/**
 * 主题操作类
 */
public class SubscriptionSubject implements Subject{

    //定义一个集合,用来存储多个观察者对象
    private List<Observer> observerList = new ArrayList<>();

    @Override
    public void attach(Observer observer) {
        observerList.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observerList.remove(observer);
    }

    @Override
    public void notify(String message) {
        //遍历集合
        for (Observer observer : observerList) {
            //调用观察者对象中的 update 方法
            observer.update(message);
        }
    }
}

 5、ObserverPattern

 

 

package com.xu.demo.observerPattern;

public class ObserverPattern {

    public static void main(String[] args) {

        //1.创建主题对象
        SubscriptionSubject subject = new SubscriptionSubject();
        Observer ronnie = new ConcreteObserver("Ronnie");
        Observer ding = new ConcreteObserver("Ding");
        Observer trump = new ConcreteObserver("Trump");

        //2.观察者订阅主题
        subject.attach(ronnie);
        subject.attach(ding);
        subject.attach(trump);

        //3.更新主题
        subject.notify("Java专栏更新了!");

        System.out.println("====================我是分割线==================");
        //4.观察者取消订阅主题
        subject.detach(ding);
        subject.detach(trump);

        //5.更新主题
        subject.notify("Python专栏更新了!");

    }

}

运行结果:

至此,一个最简单的 发布-订阅 (Publish/Subscribe) 模式代码实例就完成了,大家认真理解好好体会,你也能成为IT高手,我们下回再见。

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

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

相关文章

云原生架构案例分析_1.某旅行公司云原生改造

随着云计算的普及与云原生的广泛应用&#xff0c;越来越多的从业者、决策者清晰地认识到“云原生化将成为企业技术创新的关键要素&#xff0c;也是完成企业数字化转型的最短路径”。因此&#xff0c;具有前瞻思维的互联网企业从应用诞生之初就扎根于云端&#xff0c;谨慎稳重的…

2年JAVA今日头条3轮面试经历

面头条的时候已经是十月底了。大半个月没有面试&#xff0c;之前准备的知识点比如http状态码之类的记忆性的东西&#xff0c;早就忘光了。 二面的时候问了一堆状态码&#xff0c;全都不记得了。面试官态度很好&#xff0c;跟我说&#xff0c;你现在不记得了&#xff0c;说明你…

STM32远程更新

1 IAP 概述 1.1 工作原理 在应用中编程&#xff08; IAP &#xff09;是一种在现场通过 MCU 的通信接口&#xff08;例如 UART,USB,CAN 和以太网 等&#xff09;进行固件升级的方式。 当启动微控制器时&#xff0c;您可以选择让它进入 IAP 模式以执行 IAP 代码&am…

企业级数据保护:华企盾DSC敏感内容识别与加密技术

在当今数字化时代&#xff0c;企业面临的数据安全挑战日益严峻。敏感数据的泄露不仅会导致经济损失&#xff0c;还可能损害企业的声誉和客户信任。因此&#xff0c;采用先进的敏感内容识别和加密技术&#xff0c;例如华企盾DSC敏感内容识别&#xff0c;对企业数据进行有效保护至…

PyCharm如何更换解析器为Anaconda,如何自己切换python环境

自己使用了Anaconda创建了一个环境&#xff1a; 如何在工具PyCharm中切换自定义的python环境呢&#xff1f; 1. 点击 设置 2. 项目&#xff1a;python - Python解析器 此时会发现&#xff0c;只有一个默认的版本。 3. 点击 添加解析器 - 添加本地解析器 4. 选择 conda 环境…

全球AI新闻速递6.6

1.伏羲升级&#xff01;智能气象创新生态联盟成立。 2.微软&#xff1a;首个大规模大气基础模型Aurora。 3.鸿海集团&#xff1a;宣布在高雄建造先进算力中心&#xff0c;与NVIDIA在 AI 领域合作展开多方面合作。 4.全球首个全切片数字病理学模型GigaPath发布。 5.OpenAI与…

DDS自动化测试落地方案 | 怿星科技携最新技术亮相是德科技年度盛会

5月28日&#xff0c;怿星科技作为是德科技的重要合作伙伴亮相Keysight World Tech Day 2024。在此次科技盛会上&#xff0c;怿星科技不仅展示了领先的DDS自动化测试解决方案等前沿技术&#xff0c;还分享了在“周期短、任务重”的情况下&#xff0c;如何做好软件开发和测试验证…

指纹考勤机的运用办法,指纹考勤机一台多少钱

指纹考勤机的运用办法&#xff0c;指纹考勤机一台多少钱 通常普通的指纹考勤机仅需几十元到一百元上下&#xff0c;只具备单纯的打卡功能&#xff0c;使用体验较差&#xff1b;这种考勤机仅有基础的指纹打卡时间记录&#xff0c;拷贝需要 U 盘&#xff0c;整理则需人员进…

多曝光融合算法(三)cv2.createAlignMTB()多曝光图像融合的像素匹配问题

文章目录 1.cv2.createAlignMTB() 主要是计算2张图像的位移&#xff0c;假设位移移动不大2.多曝光图像的aline算法&#xff1a;median thresold bitmap原理讲解3.图像拼接算法stitch4.多曝光融合工具箱 1.cv2.createAlignMTB() 主要是计算2张图像的位移&#xff0c;假设位移移动…

EXCEL从图片链接获取图片

step1: 选中图片地址列 step2:开发工具→Visual Basic 文件→导入 导入我制作的脚本&#xff08;代码见文章末尾&#xff09; 点击excel的小图标回到表格界面。 点击【宏】 选中刚才导入的脚本&#xff0c;点执行&#xff0c;等待完成。 代码本体&#xff1a; Sub InsertPict…

数据结构与算法-12_二叉搜索树

文章目录 1.概述2.实现定义节点查询Comparable最小最大新增前驱后继删除找小的找大的找之间小结 3.习题E01. 删除节点-Leetcode 450E02. 新增节点-Leetcode 701E03. 查询节点-Leetcode 700E04. 验证二叉搜索树-Leetcode 98E05. 求范围和-Leetcode 938E06. 根据前序遍历结果构造…

VB.net实战(VSTO):Excel插件的安装与卸载

1. 安装 1.1编程环境&#xff1a;Visual Studio 2022 1.2创建新项目&#xff1a; 1.3 加入一行测试程序&#xff1a;MsgBox&#xff08;“hello”&#xff09;&#xff0c;点击启动&#xff0c;确认可以弹窗 1.4 点击发布 1.5 找到安装程序&#xff0c;点击安装。打开Excel程…

XM平台的交易模式模式是什么?

外汇交易平台的盈利模式主要分为两种&#xff1a;有交易员平台和无交易员平台。 有交易员平台&#xff0c;也称为做市商平台&#xff0c;为客户提供交易市场&#xff0c;并在需要时与客户持相反方向的交易&#xff0c;从中赚取利润。交易者看到的买入卖出价可能与实际价格不同&…

Android完整备份:备份Android手机数据的4种最佳方法

如今&#xff0c;人们每天都依赖手机&#xff0c;丢失数据对我们所有人来说都是一个大麻烦。由于生活是不可预测的&#xff0c;没有人知道什么时候他的数据可能会被意外删除或丢失。因此&#xff0c;仔细备份手机数据非常重要。大多数主要智能手机平台都具有将数据备份到计算机…

在Win10安装MySQL环境以及更改相关配置---附带每一步截图

下载MySQL数据库 MySQL官网链接 选择合适自己的版本&#xff0c;这里我选择5.7.17&#xff0c;选择安装包大的那一个&#xff0c;这个是离线安装&#xff0c;下载到本地后进行安装。 选择“No thanks&#xff0c;just start my download.”即进入下载状态。 安装 运行安…

JavaSE——【方法的使用】(二)

文章目录 前言一、方法重载二、递归总结 前言 在无尽的宇宙深处&#xff0c;一艘造型奇特的飞船如流星般划过黑暗。飞船内部&#xff0c;各种高科技设备闪烁着冷峻的光芒。一位年轻的宇航员正专注地操作着控制面板&#xff0c;面板上突然弹出JavaSE—方法的使用的续篇更新了&am…

【Python Cookbook】S01E20 fnmatch 模块做字符串匹配

目录 问题解决方案讨论 问题 在不同的操作系统下&#xff0c;怎样做字符串匹配&#xff1f; 解决方案 fnmatch() 模块提供两个函数&#xff0c;fnmatch() 以及 fnmatchcase() 可以用来执行做这样的匹配。 from fnmatch import fnmatch, fnmatchcasematch_res fnmatch(foo.…

MBR10100FCT-ASEMI肖特基二极管MBR10100FCT

编辑&#xff1a;ll MBR10100FCT-ASEMI肖特基二极管MBR10100FCT 型号&#xff1a;MBR10100FCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;10A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1…

Python实现定时任务的三种方案——schedule、APScheduler、Celery

schedule schedule是一个轻量级的Python库&#xff0c;用于定期执行任务&#xff0c;即定时任务调度。它提供了一种简单直观的方式来自定义任务执行的时间规则&#xff0c;而无需复杂的线程或进程管理知识。schedule适用于那些需要在后台定期执行某些功能的Python应用程序&…

指令工程Prompt的演变:从必须技能到AI内置功能

前言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;我们见证了许多领域的变革。在AI的早期&#xff0c;指令工程&#xff08;Prompt Engineering&#xff09;是一项关键技能&#xff0c;它允许我们更有效地与AI进行交互&#xff0c;指导AI完成特定的任务…