设计模式学习之观察者模式

news2024/12/30 2:03:07

设计模式系列往期文章

  1. 设计模式学习之策略模式
  2. 设计模式学习之策略模式在前端的应用
  3. 设计模式学习之简单工厂模式
  4. 设计模式学习之工厂方法模式
  5. 设计模式学习之抽象工厂模式
  6. 设计模式学习之策略模式和简单工厂模式的对比

这是设计模式系列的第7篇文章,在这之前我们已经介绍过了设计模式中最常使用的工厂模式和策略模式,本文将详细介绍一下观察者模式。观察者模式是行为模式中的一种,许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
在这里插入图片描述
举个例子,如果你希望持续接收某个微信公众号发送的消息,你可以点击订阅,那么每次公众号有新的文章发布了就会推送给你,你就是订阅者,对应的微信公众号就是发布者。下图是观察者模式的结构,在发布者Publisher类中定义了一个订阅者数组用来维护所有订阅者信息,其中还有添加订阅者、删除订阅者、通知订阅者等方法;而在订阅者Subscriber类中有更新数据的方法,可以供发布者调用:
在这里插入图片描述
下面给出观察者模式的伪代码:

// 发布者基类包含订阅管理代码和通知方法。
class EventManager is
    private field listeners: hash map of event types and listeners

    method subscribe(eventType, listener) is
        listeners.add(eventType, listener)

    method unsubscribe(eventType, listener) is
        listeners.remove(eventType, listener)

    method notify(eventType, data) is
        foreach (listener in listeners.of(eventType)) do
            listener.update(data)

// 具体发布者包含一些订阅者感兴趣的实际业务逻辑。我们可以从发布者基类中扩
// 展出该类,但在实际情况下并不总能做到,因为具体发布者可能已经是子类了。
// 在这种情况下,你可用组合来修补订阅逻辑,就像我们在这里做的一样。
class Editor is
    public field events: EventManager
    private field file: File

    constructor Editor() is
        events = new EventManager()

    // 业务逻辑的方法可将变化通知给订阅者。
    method openFile(path) is
        this.file = new File(path)
        events.notify("open", file.name)

    method saveFile() is
        file.write()
        events.notify("save", file.name)

    // ……


// 这里是订阅者接口。如果你的编程语言支持函数类型,则可用一组函数来代替整
// 个订阅者的层次结构。
interface EventListener is
    method update(filename)

// 具体订阅者会对其注册的发布者所发出的更新消息做出响应。
class LoggingListener implements EventListener is
    private field log: File
    private field message: string

    constructor LoggingListener(log_filename, message) is
        this.log = new File(log_filename)
        this.message = message

    method update(filename) is
        log.write(replace('%s',filename,message))

class EmailAlertsListener implements EventListener is
    private field email: string
    private field message: string

    constructor EmailAlertsListener(email, message) is
        this.email = email
        this.message = message

    method update(filename) is
        system.email(email, replace('%s',filename,message))


// 应用程序可在运行时配置发布者和订阅者。
class Application is
    method config() is
        editor = new Editor()

        logger = new LoggingListener(
            "/path/to/log.txt",
            "有人打开了文件:%s");
        editor.events.subscribe("open", logger)

        emailAlerts = new EmailAlertsListener(
            "admin@example.com",
            "有人更改了文件:%s")
        editor.events.subscribe("save", emailAlerts)

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

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

相关文章

React函数式组件

1. 创建函数式组件 我们可以通过所定义的函数来进行react中组件的定义。首先我们可以定义一个函数,然后通过函数的返回值来进行相关组件的定义。例如下面这张写法,我们可以通过调用一个函数,通过其返回值来进行相关的操作。 function Test()…

chatgpt赋能python:Python遍历A到Z:SEO优化的关键

Python遍历A到Z:SEO优化的关键 对于任何一家网站来说,SEO (Search Engine Optimization, 搜索引擎优化)都是至关重要的,特别是在当今数字时代,人们常常会在搜索引擎中查找信息并浏览不同网站。其中一个重要的SEO策略是为每个网站…

笔记本安装双系统ubuntu时踩的坑——戴尔

如果你遇到以下的这些问题,不要直接装了,无解!!! 建议看我另一篇教程,把硬盘取出来在另外的电脑上装好系统再放回去,这样嘎嘎快。 移动硬盘中安装Ubuntu 20.04系统——立省99%的问题_放风筝的…

水质监测的重要性及应用

水质监测是保障水环境安全和人民健康的重要手段。随着城市化进程的加速和工业化程度的提高,水污染问题日益严重,水质监测的重要性也越来越凸显。水质监测是指对水体中的各种物理、化学和生物参数进行监测和分析,以评估水体的质量和污染程度。…

概率论--随机事件与概率--贝叶斯公式--随机变量

目录 随机事件与概率 概念 为什么要学习概率论 随机事件与随机事件概率 随机事件 随机事件概率 贝叶斯公式 概念 条件概率 概率乘法公式 贝叶斯公式 举个栗子 随机变量 随机变量的定义 随机变量的分类 离散型随机变量 连续型随机变量 随机事件与概率 概念 …

和Git相关的一些问题

1. Git拉取项目的两种方式以及区别 方式 Http:通过http方式的clone项目,不需要在git上手动绑定ssh,只需要在clone的时候输入账号,密码即可;SSH:通过ssh方式clone项目,需要手动绑定ssh密钥 区别 …

Linux——从零到精通

目录 前言: 一.Linux介绍 二.Linux基础命令 三.链接和文章从零到实战 基本信息介绍 Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱: 桌面环境 Linux为什么象征着企鹅 命名与读法 前言: 本篇文章结合所有从零到精通 Linux…

如何在jupyter notebook 中添加虚拟环境

一&#xff0e;如何在jupyter notebook 中添加虚拟环境 假设在D:\tf_training\envTraining创建了名为env_training的虚拟环境。 1.安装IPykernel < python2 > pip install ipykernel < python3 > pip install ipykernel 说明&#xff1a;最好进入到虚拟环境…

STM32单片机(九)USART串口----第九节:STLINK Utility

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

第24天-订单服务(订单确认、订单接口幂等、订单验价、锁定库存)

f# 1.Docker安装RabbitMQ docker run -d --name rabbitmq \ -p 5672:5672 -p 25672:25672 -p 15672:15672 \ -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin \ --restartalways \ rabbitmq:management5672&#xff1a;AMQP端口25672&#xff1a;集群端口15672&…

和Cookie相关的一些问题

目录 1. Cookie储存在哪里&#xff1f; 2. 不同网站可以互相访问对方的Cookie吗&#xff1f; 3.二级域名能够读到一级域名的Cookie吗&#xff1f; 1. Cookie储存在哪里&#xff1f; Cookie是前后端共享的&#xff0c;故肯定是存在浏览器的。 在浏览器开发者工具中可以找到C…

### 4.1 Hadoop生态系统

狭义的Hadoop VS 广义的Hadoop 广义的Hadoop&#xff1a;指的是Hadoop生态系统&#xff0c;Hadoop生态系统是一个很庞大的概念&#xff0c;hadoop是其中最重要最基础的一个部分&#xff0c;生态系统中每一子系统只解决某一个特定的问题域&#xff08;甚至可能更窄&#xff09;…

UE5.2 Mobile安卓游戏 Graphics Profile工具使用总结

Android Graphics Profile工具 Android游戏Profile 图形帧的常用工具有: snapdragon profiler, renderdoc, 手机游戏APP环境 (1)opengl es3.1/3.2或者vulkan (2)UE5 Android 打Debug包 (3)USB连接电脑的设置: 手机连接电脑&#xff0c;开启USB传输文件模式&#xff0c;开…

全志V3S嵌入式驱动开发(解决32M spi-nor无法复位问题)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前制作spi-nor image的时候&#xff0c;就发现v3s存在无法复位的问题。只要进入linux之后&#xff0c;不管是console输入reboot指令&#xff0c;…

【C/C++解决读者-写者问题】

目录 一、问题描述二、问题分析三、三种策略实现1.读者优先策略2. 读写公平策略3.写者优先策略&#xff08;后续更新&#xff09; 一、问题描述 有读者和写者两组并发进程&#xff0c;共享一个文件&#xff0c;当两个或两个以上的读进程&#xff08;只是读数据&#xff0c;不会…

将数据转化为创新机会:8 种业务分析模型指南

当我们想要创新时&#xff0c;往往需要有实际的依据来支撑我们的想法。商业咨询顾问通常被认为是聪明的人&#xff0c;他们拥有模型化的分析思维&#xff0c;这种思维方式可以帮助他们更好地理解市场、竞争对手和客户需求。商业分析思维是一种系统性的思考方式&#xff0c;它可…

力扣 222. 完全二叉树的节点个数

题目来源&#xff1a;https://leetcode.cn/problems/count-complete-tree-nodes/description/ C题解1&#xff1a;层序遍历计算节点。 时间复杂度&#xff1a;O(n)空间复杂度&#xff1a;O(n) /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

已开源!网易云信的热点探测平台实践

背景 对于一个互联网平台&#xff0c;特别是 toB 的 PaaS/SaaS 平台&#xff0c;热点 key 是一个绕不过去的问题。作为一个开放的系统&#xff0c;平台每天要承载来自大量的外部系统或者海量终端的请求&#xff0c;虽然所有的请求都需要满足开放平台定义好的鉴权规则&#xff0…

虚幻引擎(UE5)-大世界分区WorldPartition教程(四)

文章目录 前言一、Data Layers的使用1.添加Actor到Data Layers2.运行时处理 总结 上一篇&#xff1a;虚幻引擎(UE5)-大世界分区WorldPartition教程(三) 前言 Data Layers&#xff08;UE4中叫Layers&#xff09;用于将Actor划分到不同的Layer中&#xff0c;通过在编辑器和运行…

Qt在Ubuntu下如何进行桌面软件开发?

文章目录 0.引言1.新建项目2.编写第一个程序3.在Qt外部启动程序 0.引言 笔者研究的方向涉及在ubuntu中运行代码&#xff0c;早先是直接利用控制台运行代码文件&#xff0c;在控制台中虽然设法将代码精简到一个三个文件中&#xff0c;只需要在控制台运行这三个文件即可&#xff…