设计模式之监听模式

news2025/1/20 18:34:35

  本文将会介绍设计模式中的监听模式
  监听模式是一种一对多的关系,可以有任意个(一个或多个)观察者对象同时监听某一个对象。监听的对象叫观察者(Observer),被监听的对象叫作被观察者(Observable)。被观察者对象在状态或内容(数据)发生变化时,会通知所有观察者对象,使它们能够做出相应的变化。
  监听模式又名观察者模式,顾名思义就是观察与被观察的关系。比如你在烧开水的时候看着它开没开,你就是观察者,水就是被观察者;再比如你在带小孩,你关注他是不是饿了,是不是渴了,是不是撒尿了,你就是观察者,小孩就是被观察者。观察者模式是对象的行为模式,又叫发布/订阅(Publish/Subscribe)模式、模型/视图(Model/View)模式、源/监听器(Source/Listener)模式或从属者(Dependents)模式。
  监听模式的核心思想就是在被观察者与观察者之间建立一种自动触发的关系。

例子

  以家中常见的热水器为例,需对水温进行监控,当水温在50-70℃时,会发出警告:可以用来洗澡了!当水温在100℃时,会发出警告:可以用来饮水了!在这里洗澡模式和饮用模式扮演了监听的角色,而热水器则是被监听的对象。一旦热水器中的水温度发生变化,监听者就能及时知道并做出相应的判断和动作。
  UML类图如下:
监听模式的类图
Python代码如下:

# -*- coding: utf-8 -*-
from abc import ABCMeta, abstractmethod


# 观察者的基类
class Observer(metaclass=ABCMeta):
    @abstractmethod
    def update(self, observable, object):
        pass


# 被观察者的基类
class Observable:
    def __init__(self):
        self.__observers = []

    def addObserver(self, observer):
        self.__observers.append(observer)

    def removeObserver(self, observer):
        self.__observers.remove(observer)

    def notifyObservers(self, object=0):
        for o in self.__observers:
            o.update(self, object)


# 热水器
class WaterHeater(Observable):
    def __init__(self):
        super().__init__()
        self.__temperature = 25

    def getTemperature(self):
        return self.__temperature

    def setTemperature(self, temperature):
        self.__temperature = temperature
        print(f"当前温度是:{str(self.__temperature)}℃")
        self.notifyObservers()


# 洗澡模式
class WashingMode(Observer):
    def update(self, observable, object):
        if isinstance(observable, WaterHeater) and 50 <= observable.getTemperature() <= 70:
            print("水已烧好!温度正好,可以用来洗澡了。")


# 饮用模式
class DrinkingMode(Observer):
    def update(self, observable, object):
        if isinstance(observable, WaterHeater) and observable.getTemperature() >= 100:
            print("水以烧开!可以用来饮用了。")


def testWaterHeater():
    heater = WaterHeater()
    washingObser = WashingMode()
    drinkingObser = DrinkingMode()
    heater.addObserver(washingObser)
    heater.addObserver(drinkingObser)
    heater.setTemperature(40)
    heater.setTemperature(60)
    heater.setTemperature(100)


if __name__ == '__main__':
    testWaterHeater()

输出结果如下:

当前温度是:40℃
当前温度是:60℃
水已烧好!温度正好,可以用来洗澡了。
当前温度是:100℃
水以烧开!可以用来饮用了。

总结

  在设计监听模式的程序时需要注意以下几点:

  • 要明确谁是观察者谁是被观察者,只要明白谁是应该关注的对象,问题也就明白了。一般观察者与被观察者之间是多对一的关系,一个被观察对象可以有多个监听对象(观察者)。
  • Observable在发送广播通知的时候,无须指定具体的Observer,Observer可以自己决定是否订阅Subject的通知。
  • 被观察者至少需要有三个方法:添加监听者、移除监听者、通知Observer的方法。观察者至少要有一个方法:更新方法,即更新当前的内容,做出相应的处理。
  • 添加监听者和移除监听者在不同的模型称谓中可能会有不同命名。

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

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

相关文章

QObject对象生命周期管理

QObject对象生命周期管理 1.C中对象的生命周期管理是一个非常重要的话题&#xff0c;因为C需要程序员自己手动管理内存&#xff0c;而这也是C程序经常容易出现内存问题的重要原因。 1.1 特别是多线程环境下如何正确管理好对象的生命周期&#xff0c;更是C程序开发中的一个难点…

对抗样本-(CVPR 2022)-通过基于对象多样化输入来提高有针对性对抗样本的可迁移性

论文地址&#xff1a;https://arxiv.org/abs/2203.09123 代码地址&#xff1a;https://github.com/dreamflake/ODI 摘要&#xff1a;本文提出了一种新的方法来生成有针对性的对抗样本&#xff0c;该方法通过使用多种不同的输入图像来生成更加丰富和多样化的图像。具体而言&…

hashlib模块

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 hashlib模块专栏&#xff1a;《python从入门到实战》 哈希算法&#xff0c;也叫摘要算法。 加密&…

Postcat 插件上线,支持 ApiPost 格式导入

作为开源的 API 管理工具&#xff0c;Postcat 已经支持 Postman、swagger、Eolink 等平台的数据导入导出。 前不久有用户跟我们提需求&#xff0c;想要 Postcat 支持国内的一些主流的 API 管理工具&#xff0c;好消息是现在不就支持了么&#xff01; 最近我们的插件广场上线了一…

etcd概述

本文主要介绍了 etcd 相关概念&#xff0c;以及 etcd 的主要使用场景 1. 介绍 etcd 是云原生架构中的基础组件&#xff0c;由 CNCF 孵化托管。etcd 在微服务和 kubernetes 集群中不仅可以作为服务注册中心用于服务发现&#xff0c;还可以作为 key-value 存储中间件etcd 是 Co…

Spring的Bean初始化过程和生命周期

Spring的Bean初始化过程和生命周期一、Spring创建bean的流程图二、Spring创建bean的详细流程1.加载bean信息2.实例化bean3.bean属性填充4.初始化bean5.后置操作三、bean的生命周期四、总结Spring的核心功能有三点IOC、DI、AOP&#xff0c;IOC则是基础&#xff0c;也是Spring功能…

Python+Requests模拟发送post请求

模拟发送post请求 发送post请求的基础知识dumps和loads 代码示例&#xff1a; # 发送post请求 import requests,json # 发送post请求的基础知识dumps和loads str_dict {name:xiaoming,age:20,sex:男} print(type(str_dict)) str1 json.dumps(str_dict) # 1,json.dumps 是把…

git 本地新建并提交上传仓库

初始化步骤基本解释 新建readme touch README.md 初始化仓库 git init 添加仓库下所有文件 git add . 提交 备注到本地 git commit -m "备注" 链接远程git库 git remote add origin 新建库ssh链接 上传代码 git push -u origin master 初始化操作步骤 touch README.…

【Ubuntu】Ubuntu20基础配置+go开发配置

这里写自定义目录标题1 基础配置1.1 安装ifconfig网络管理工具1.2 初始化root密码1.3 换镜像源1.4 关闭息屏休眠1.5 关闭自动更新2 开发环境2.1 go2.1.1 建立软件目录并安装软件2.1.2 建立go工作目录2.1.3 配置环境变量2.2 mysql2.2.1 安装2.2.2 建立对外用户并更改密码2.2.3 修…

江苏三年制专转本法学类考纲配套课程网课题库

江苏三年制专转本法学类考纲配套课程网课题库1、江苏专转本的考试科目都有哪些&#xff1f; 2022年开始江苏专转本成绩主要由语文/数学英语/日语专业课三科的成绩构成&#xff0c;满分500分。分别给大家解释一下 语文/数学&#xff1a;满分150分&#xff08;文科考语文&#xf…

[源码解析]socket系统调用上

文章目录socket函数API内核源码sock_createinet_createsock_allocsock_map_fd相关数据结构本文将以socket函数为例&#xff0c;分析它在Linux5.12.10内核中的实现&#xff0c;先观此图&#xff0c;宏观上把握它在内核中的函数调用关系&#xff1a;socket函数API socket 函数原…

王小川,才是深「爱」李彦宏的那个人?

在推出中国首个类ChatGPT产品「文心一言」后&#xff0c;李彦宏在接受专访时断言&#xff0c;中国基本不会再出一个OpenAI了&#xff0c;「创业公司重新做一个ChatGPT其实没有多大意义&#xff0c;基于大语言模型开发应用机会很大&#xff0c;没有必要再重新发明一遍轮子。」 听…

【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

深入理解扩散模型&#xff1a;Diffusion Models引言扩散模型的原理扩散过程反向过程优化目标模型设计代码实现Stable Diffusion、DALL-E、Imagen背后共同的套路Stable DiffusionDALL-E seriesImagenText encoderDecoder什么是FID&#xff08;Frechet Inception Distance&#x…

uni-app--》如何实现网上购物小程序(上)?

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

YOLOv8源码逐行解读(yolov8.yaml)(更新中)

本人也是刚接触YOLO不久的菜鸟一个&#xff0c;写博客主要是记录自己的学习过程&#xff0c;如果有写的不对的地方欢迎大家批评指正&#xff01; yolov8.yaml 官方下载地址&#xff1a;https://github.com/ultralytics/ultralytics/tree/main/ultralytics/models/v8 # Ultral…

工业机器人三大主流行业浮动去毛刺应用深度详解

工业机器人是一种能够自动执行各种工业任务的机器人&#xff0c;它的使用不仅能将工人从繁重或有害的体力劳动中解放出来&#xff0c;解决当前劳动力短缺问题&#xff0c;而且能够提高生产效率和产品质量&#xff0c;增强企业整体竞争力&#xff0c;被广泛地应用于工业各个生产…

软件测试岗,4 轮面试成功拿下字节 Offer..........

一共经历了四轮面试&#xff1a;技术4面&#xff0b;HR面。 特整理出所涉及的全部知识点&#xff0c;并复盘了完整面试题及答案&#xff0c;分享给大家&#xff0c;希望能够帮到一些计划面试字节的朋友。 一、测试基础理论类 怎么编写案例?软件测试的两种方法测试结束的标准…

SpringBoot解析指定Yaml配置文件

再来个文章目录 文章目录前言1、自定义配置文件2、配置对象类3、YamlPropertiesSourceFactory下面还有投票&#xff0c;帮忙投个票&#x1f44d; 前言 最近在看某个开源项目代码并准备参与其中&#xff0c;代码过了一遍后发现多个自定义的配置文件用来装载业务配置代替数据库…

打造最小VR头显,软件开发商Bigscreen缘何跨进VR硬件市场?

今年2月&#xff0c;Bigscreen推出了一款非常轻薄的PC VR头显&#xff1a;Beyond。该头显的特点是采用两块1英寸Micro OLED屏幕&#xff08;RGB Stripe排列&#xff09;&#xff0c;可带来双眼5K分辨率&#xff0c;28 PPD&#xff0c;75Hz/90Hz刷新率和90x93FOV。目前Beyond虽还…

Linux移植:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(4.1.15版本内核)

Linux移植&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;4.1.15版本内核&#xff09; 文章目录Linux移植&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;4.1.15版本内核&#xff09;1.出厂源码编译1 修改顶层 …