观察者模式(ObserverPattern)

news2024/11/26 0:55:11

文章目录

  • 1.观察者模式定义
  • 2.UML类图
  • 3.实现代码

1.观察者模式定义

定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象
杂志和报纸订阅
如果你订阅了一份杂志或报纸, 那就不需要再去报摊查询新出版的刊物了。 出版社 (即应用中的 “发布者”) 会在刊物出版后 (甚至提前) 直接将最新一期寄送至你的邮箱中。
出版社负责维护订阅者列表, 了解订阅者对哪些刊物感兴趣。 当订阅者希望出版社停止寄送新一期的杂志时, 他们可随时从该列表中退出。

2.UML类图

在这里插入图片描述

3.实现代码

观察者:

// 观察者接口
public interface IObserver
{
    void Update(ISubject subject);
}

// 具体观察者A
public class ObserverA : IObserver
{
    public void Update(ISubject subject)
    {
        Console.WriteLine(string.Format("ObserverA observe Subject change:StateNum={0}", (subject as Subject).StateNum));
    }
}

// 具体观察者B
public class ObserverB : IObserver
{
    public void Update(ISubject subject)
    {
        Console.WriteLine(string.Format("ObserverB observe Subject change:StateNum={0}", (subject as Subject).StateNum));
    }
}

被观察者:

// 被观察者接口
public interface ISubject
{
    // 订阅
    void Subscribe(IObserver observer);

    // 取消订阅
    void Unsubscribe(IObserver IObserver);

    // 广播
    void Notify();
}

// 具体被观察者
public class Subject : ISubject
{
    // 状态数字
    public int StateNum{get; set;}

    private List<IObserver> _observables = new List<IObserver>();

    public void Notify()
    {
        StateNum = new Random().Next(0, 10);
        Console.WriteLine(string.Format("StateNum Change:StateNum={0}", StateNum));

        foreach (var observer in _observables)
        {
            observer.Update(this);
        }
    }

    public void Subscribe(IObserver observer)
    {
        _observables.Add(observer);
    }

    public void Unsubscribe(IObserver observer)
    {
        _observables.Remove(observer);
    }
}

使用:

Subject subject = new Subject();
var observeA = new ObserverA();
var observeB = new ObserverB();

subject.Subscribe(observeA);
subject.Subscribe(observeB);
subject.Notify();

subject.Unsubscribe(observeA);
subject.Notify();

StateNum Change:StateNum=2
ObserverA observe Subject change:StateNum=2
ObserverB observe Subject change:StateNum=2
StateNum Change:StateNum=5
ObserverB observe Subject change:StateNum=5

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

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

相关文章

记录一个lombok和mybatisplus的问题,@Data注解失效

刚开始我这里一直爆红&#xff0c;Article实体类也加了Data注解 依赖也导入了lombok&#xff0c;后来觉得是版本的问题&#xff0c;换了几个版本也是不行 后来最后还是在各种资料下&#xff0c;找到了原因 首先使用lombok不是只要导入依赖就行的&#xff0c;还要有插件&#…

软件工程造价师习题练习 11

1.如果数据功能由被度量应用维护&#xff0c;则为一个EIF。 错误 正确 如果数据功能由被度量应用维护&#xff0c;则为一个ILF。如果数据功能由被度量应用引用但不维护&#xff0c;且其为其他应用的一个ILF&#xff0c;则为一个 EIF。 答案&#xff1a;错误 2.图书管理系统…

【傅里叶分析】复数基础知识

【傅里叶分析】复数基础知识 复数复数的几何意义与点的对应与向量的对应 复数与极坐标辐角与辐角主值三角函数 参考文献 本文参考了网上的其他文章&#xff0c;已在文末参考文献中列出&#xff1b;如有侵权&#xff0c;请联系我删除。 复变函数是傅里叶分析的基础&#xff0c;而…

OpenCV图像滤波(12)图像金字塔处理函数pyrDown()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数主要是对图像进行模糊处理并将其降采样。 默认情况下&#xff0c;输出图像的大小计算为 Size((src.cols1)/2, (src.rows1)/2)&#xff0c;但…

初识C++(下):const引用/inline/nullptr

1.引用 1.1const引用 可以引用一个const对象&#xff0c;但是必须用const引用。const引用也可以引用普通对象&#xff0c;因为对象的访问权限在引用过程中可以缩小&#xff0c;但是不能被放大 #include<iostream>using namespace std;int main() {const int a 10;//权…

SpringBoot中整合RabbitMQ(测试+部署上线 最完整)

一、RabbitMQ安装 由于在测试环境中&#xff0c;我们现在虚拟机上基于docker安装mq docker run \-e RABBITMQ_DEFAULT_USERquick \-e RABBITMQ_DEFAULT_PASS123 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network your-net\-d \r…

学习文本到语音转换技术时为何要掌握Mel频谱图?

理解Mel频谱图 “Mel”指的是梅尔频率刻度&#xff08;Mel Frequency Scale&#xff09;&#xff0c;这是一种基于人类听觉感知方式的频率刻度。梅尔频率刻度旨在更好地模拟人耳对声音的感知&#xff0c;因为人类对频率的感知并不是线性的&#xff0c;而是对低频更敏感&#x…

gitlab查看root密码

gitlab查看root密码 gitlab安装后会创建默认的root密码&#xff0c;密码存在配置文件cat /etc/gitlab/initial_root_password中。

深度解析Edge SCDN与CDN:安全加速,全面防护

在现代互联网应用中&#xff0c;CDN已成为提高网站和应用性能不可或缺的技术之一。然而&#xff0c;随着网络安全威胁的日益严峻&#xff0c;单纯依靠CDN提供的加速服务已经不足以满足企业的安全需求。因此&#xff0c;Edge SCDN出现了&#xff0c;它不仅具备CDN的加速特性&…

Selenium + Python 自动化测试12(unittest组织更多用例)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了unittest中test suite 的构建&#xff0c;可以测试多条测试用例。 本篇文章我们接着讲。使用discover()方法构建更多的测试用例。 1、引入需要完成的任务 上…

【鸿蒙教程】快速集成鸿蒙 IM SDK 并实现单聊发送消息

本文手把手教您快速集成鸿蒙版环信即时通讯 IM 并实现单聊。 教程目录 前提条件准备开发环境SDK导入及声明SDK 初始化注册监听回调注册登录发送消息 前提条件 DevEco Studio NEXT Developer Beta1&#xff08;5.0.3.300&#xff09;及以上&#xff1b;HarmonyOS SDK API 12…

4款视频剪辑免费软件推荐,剪辑必备的神器!

对于许多新入门的剪辑小白或者经费有限的剪辑朋友来说&#xff0c;寻找一款免费且好用的剪辑软件是非常重要的。今天&#xff0c;我就来给大家分享4款很实用且专业的免费剪辑软件。 1、福昕免费剪辑 直达链接&#xff1a;www.pdf365.cn/foxit-clip/ 第一个是款功能全面且易上…

支持海思3520D平台网络硬盘录像机NVR源码与NVR解决方案

支持海思3520D平台网络硬盘录像机NVR源码与NVR解决方案 本NVR模组基于HiSilicon&#xff08;海思&#xff09;平台&#xff0c;提供了一套完整的网络视频录像机&#xff08;NVR&#xff09;解决方案。该方案集成了视频接入、存储、回放、智能处理、告警及系统管理等功能模块&a…

数字化转型的权威指南:《数字化时代的敏捷架构》

「链接」https://shop.architectszone.org.cn/p/t_pc/goods_pc_detail/goods_detail/v_66bc7093e4b0d84dab16b12c 《数字化时代的敏捷架构》培训课程 全球最具影响力数字化转型架构出品方The Open Group 专注于企业架构师职业发展的平台AZone联合推出 The Open Group&#x…

第一百九十七节 Java集合教程 - Java集合Map映射

Java集合教程 - Java映射 映射表示包含的集合键值映射。 Map是一个集合&#xff0c;其中每个元素表示一个键值对作为<key&#xff0c;value> ;.<key&#xff0c;value> 对也称为映射中的条目。键和值必须是引用类型。 映射由 Map<K&#xff0c;V> 接口的实…

笔记:在WPF中如何注册控件级全局事件和应用程序级全局事件

一、目的&#xff1a;在WPF中如何注册控件级全局事件和应用程序级全局事件 二、实现 应用程序级全局事件 //注册应用程序级全局事件 EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(ic_event_Click)); 如上代码既会注册全局…

[爬虫基础]--抓取豆瓣top250电影, 简单易懂, 零基础入门

1. 抓取目标: 下载top250电影的图片, 并以电影名称作为文件名进行保存 2. 获取网页源代码: 我们每天看到的浏览器页面, 本质上都是html代码和css代码, 向服务器发出请求后, 服务器会返回一连串的信息, 经过浏览器选然后, 就变成了我们每天看到的界面 可以在网页中通过鼠标右…

Linux系统编程 --- day1

目录 1. 标准IO 2. 基本操作 2.1 fopen 2.2 fgetc 2.3 fputc 2.4 fgtes 2.5 fputs 2.6 fread 2.7 fwrite 3. linux的文件 1. 标准IO &#xff08;1&#xff09;标准io的概念 1975 Dennis r IO库&#xff0c;C语言的标准&#xff0c; IO --- input output I&#xff…

当前人形机器人公司及产品介绍

产品型号属地公司名字Optimus美国特斯拉Figure02美国FigureAIAtlas美国波士顿动力通用人形Apollo美国ApptronikPhoenix加拿大Sanctuary AIRoBee意大利OversonicASIMO日本本田NAO日本软银GR-1上海傅利叶远征A1上海智元XR4上海达闼先行者K1上海开普勒青龙上海国创AstribotS1深圳星…

AIDL使用及原理介绍

一、AIDL使用及理解 介绍参考官方文档&#xff1a;https://developer.android.com/develop/background-work/services/aidl?hlzh-cn 1.1、aidl文件的产物 1.1.1 aidl文件 interface IDownloadIpc {//开始下载DownloadResponse start(in DownloadInfoParcel downloadInfo);…