行为型设计模式之观察者模式

文章目录

  • 简介
    • 定义
    • 例子
  • 原理
  • 代码例子
  • 小结

简介

定义

还是先来个定义吧,如下:

观察者模式(observer pattern)的原始定义是:定义对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖项都会自动得到通知和更新。

观察者模式的别名有发布-订阅(Publish/Subscribe)模式,模型-视图(Model-View)模式、源-监听(Source-Listener) 模式等。

例子

定义知道了,那么身边的哪些事是属于它的,我们应该都清楚了。像汽车与红绿灯的关系;我们购买的一些杂志,到期分发给我们;等等。

原理

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

  • Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
  • ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
  • Observer:抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
  • ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要与具体目标保持一致.

代码例子

class DisplayA {
public:void Show(float temperature);
};class DisplayB {
public:void Show(float temperature);
};class DisplayC {
public:void Show(float temperature);
}class WeatherData {
};class DataCenter {
public:float CalcTemperature() {WeatherData * data = GetWeatherData();// ...float temper/* = */;return temper;}
private:WeatherData * GetWeatherData(); // 不同的方式
};

这是一个天气预报的例子,看下代码应该都可以看懂的。

小结

这篇文章写了行为型设计模式的第一个,观察者模式,简单写了定义,原理,以及代码实现。相信通过这些,大部分都能理解的。坚持学习,坚持输出。不分内容来自这里,有兴趣,可以看看。

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

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

相关文章

亚马逊云科技峰会福利来啦

2024 亚马逊云科技中国峰会,挑战俱乐部 Hands On 动手实验课程正在直播中,点击链接畅享生成式AI建构之旅,赢心动好礼 (直播链接Link) 只看不过瘾?别急!我们为您准备了【生成式AI助手 Amazon Q 初…

mybatis一对一,一对多,字段重复

1、一对一&#xff0c;association和javaType <resultMap type"com.example.ProdTask" id"ProdTaskMapWithDInvChkTask"><result property"taskCateg" column"ProdTask_CATEG" jdbcType"VARCHAR"/><result p…

手机视频恢复2个技巧:让您的视频资料重现生机

我们经常使用手机拍摄和保存各种视频资料&#xff0c;包括工作记录和日常生活的记忆。但有时候&#xff0c;由于误删、格式化或存储空间不足&#xff0c;我们会选择清理手机空间&#xff0c;这些视频资料可能会因此消失不见。今天&#xff0c;我们将为您揭秘手机视频恢复的技巧…

前端-TS代码解读—索引签名:type Recordable<T = any> = { [x: string]: T;}

在TypeScript中&#xff0c;这段代码定义了一个类型别名 Recordable&#xff0c;它使用了索引签名&#xff08;index signature&#xff09;来表示一个可记录&#xff08;record-like&#xff09;对象。这个类型别名是泛型的&#xff0c;这意味着它可以用于创建具有任意类型属性…

北斗卫星赋能水产养殖

北斗卫星赋能水产养殖&#xff1a;开启精准智能化新时代 天气稍有变化&#xff0c;浙江省江山市上余水产养殖场负责人就会通过手机APP实时查看鱼塘水体硝态氮、氨态氮、pH值、化学需氧量等水质参数&#xff0c;做到心中有数。这些数据由鱼塘内的巡航式底改机器人以及数字化监测…

S32K324 HSE固件加载配置及说明

文章目录 前言HSE固件HSE使用的空间FlashRamHSE的安装方式IVT结构ld文件UTEST区编程复位编译测试总结前言 本文介绍HSE固件的下载,及利用S32DS工程及PE工具安装。(本文只讨论对于full_men方式的HSE) HSE固件 注册NXP官网账号后,在S32K3 实时驱动(RTD)中

计算机视觉与深度学习实战:以Python为工具,基于帧间差法进行视频目标检测

一、引言 随着科技的飞速发展,计算机视觉和深度学习已成为当今科技领域的热门话题。它们不仅在科研领域取得了显著的成果,而且在安防监控、智能交通、医疗影像分析、工业自动化等领域得到了广泛的应用。本文旨在探讨计算机视觉与深度学习的实战应用,特别是以Python为工具,基…

Vue中使用Vue-scroll做表格使得在x轴滑动

页面效果 首先 npm i vuescroll 在main.js中挂载到全局 页面代码 <template><div class"app-container"><Header :titletitle gobackgoBack><template v-slot:icon><van-icon clickgoHome classicon namewap-home-o /></templat…

Python自动化测试中的Mock与单元测试实战

在软件开发过程中&#xff0c;自动化测试是确保代码质量和稳定性的关键一环。而Python作为一门灵活且强大的编程语言&#xff0c;提供了丰富的工具和库来支持自动化测试。本文将深入探讨如何结合Mock与单元测试&#xff0c;利用Python进行自动化测试&#xff0c;以提高代码的可…

Linux-线程池

文章目录 前言一、线程池是什么&#xff1f;二、示例代码 前言 线程池主要是对之前内容的一个巩固&#xff0c;并且初步了解池化概念。 一、线程池是什么&#xff1f; 线程池就是提前开辟好一块空间&#xff0c;随时准备创造新线程来完成任务&#xff0c;可以理解为用空间来换…

攻击同学网络,让同学断网

技术介绍&#xff1a;ARP欺骗 ARP欺骗&#xff08;ARP spoofing&#xff09;是一种网络攻击技术&#xff0c;它通过伪造ARP&#xff08;地址解析协议&#xff09;响应包来欺骗目标设备&#xff0c;使其将网络流量发送到攻击者指定的位置。具体操作步骤如下&#xff1a; 攻击者…

win/mac 崩溃内存泄漏问题分析

内存泄露排查 mac: xcode自带工具 参考 leak AddressSanitize windows: vld dmp排查 windows dmp 安装 WinDbg - Windows drivers | Microsoft Learn 本地或者远端均可用vs排查 mac dmp 本地查看控制层生成的.crash文件 远端的使用google breakpad client工具解析minidu…

C#--Mapster(高性能映射)用法

1.Nuget安装Mapster包引用 2.界面XAML部分 <Window x:Class"WpfApp35.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.m…

buffer 越大传输效率越低

在计算机科学和网络通信中&#xff0c;Buffer&#xff08;缓冲区&#xff09;扮演着至关重要的角色。然而&#xff0c;关于Buffer的大小与传输效率之间的关系&#xff0c;往往存在一个普遍的误解&#xff0c;即认为Buffer越大&#xff0c;传输效率就越高。事实上&#xff0c;过…

JQuery 入门

一、jQuery 概述 1、JavaScript 库 仓库:可以把很多东西放到这个仓库里面。找东西只需要到仓库里面查找就可以 JavaScript 库&#xff1a;即library&#xff0c;是一个封装好的特定的集合&#xff08;方法和函数&#xff09;。从封装一大堆函数的角度理解库&#xff0c;就是在…

零基础学Java第二十五天之Lambda表达式

Lambda表达式 简介 Lambda是一个匿名函数(方法)&#xff0c; 允许把函数作为一个方法的参数 。利用Lambda表达式可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力得到了提升。一般都是优化匿名内部类 基础语法 无参数、无返回值的抽…

住宅IP?

住宅IP是由主要运营商&#xff08;如电信、移动、联通等&#xff09;为用户开通的宽带业务所分配的IP地址。这些IP地址是真实的、具有实际位置的IP&#xff0c;与普通用户的设备IP和宽带网络IP一致。它们不是连续的&#xff0c;而是散点分布&#xff0c;这使得它们在使用时更加…

ModuleNotFoundError: No module named ‘simpleui‘

如果你在使用 Django 并遇到 No module named simpleui 错误,这意味着你的项目中没有安装 simpleui 模块。simpleui 是一个用于 Django 的第三方库,可以美化 Django 的管理后台。 要解决这个问题,你需要安装 simpleui 模块。下面是安装和配置 simpleui 的步骤: 1. 安装 s…

基于MyBatisPlus表结构维护工具

SuperTable表结构维护工具 一、简述 用于同步表实体与数据库表结构&#xff0c;同步建表、删改字段、索引&#xff0c;种子数据的工具… 一、开发环境 JDK&#xff1a;JDK8SpringBoot&#xff1a;2.7.2MyBatisPlus: 3.5.6MySQL: 5.7其他依赖&#xff1a;略 二、特性 表结…

论文阅读笔记:Task-Customized Mixture of Adapters for General Image Fusion

论文阅读笔记&#xff1a;Task-Customized Mixture of Adapters for General Image Fusion 1 背景2 创新点3 方法4 模块4.1 任务定制混合适配器4.2 提示生成4.3 提示驱动融合4.4 互信息正则化MIR4.5 任务定制化损失 5 实验5.1 VIF任务5.2 MEF任务5.3 MFF任务5.4 消融实验5.5 性…