C# 基于事件的观察者模式

观察者模式是一种软件设计模式,用于定义对象之间的一对多依赖关系,当一个对象的状态发生变化时,它的所有依赖者(观察者)都将得到通知并自动更新。这种模式通过解耦合主题和观察者来提高对象的灵活性。

定义
观察者模式包括一个主题(Subject)和多个观察者(Observer)。当主题的状态改变时,它会通知观察者并调用它们的特定方法,使得观察者可以自动更新。

应用场景
观察者模式常见于以下场景:
        1. 当一个对象的变化需要通知其他对象,而且你无法确切知道有多少个对象需要通知时,可以使用观察者模式。
        2. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,这时使用观察者模式可以将这两者封装在独立的对象中,使它们各自独立地改变和复用。

优点
        1. 观察者模式降低了主题和观察者之间的耦合度,使得主题和观察者可以轻松地独立变化。
        2. 支持广播通信,观察者模式可以向多个对象同时发送通知。

缺点
        1. 如果观察者过多或通知机制过于复杂,容易导致性能问题。
        2. 如果观察者和主题之间存在循环依赖,可能会导致系统崩溃或出现死循环。

观察者模式是一种广泛应用的设计模式,在许多面向对象编程语言和框架中都有相应的实现,例如在事件处理、模型-视图-控制器 (MVC) 架构中都有观察者模式的影子。

Demo

        1.Subject类

internal abstract class SubjectBase{// 将所有观察者放入list集合private readonly List<Observer> observers = new List<Observer>();public event EventHandler<EventArgs> NotifyAllHandler;public virtual void NotifyAllObserver(){NotifyAllHandler?.Invoke(this, EventArgs.Empty);}/// <summary>/// 加入集合/// </summary>/// <param name="observer"></param>public virtual void AttachObserver(Observer observer){observers.Add(observer);}/// <summary>/// 从观察者列表中去除/// </summary>/// <param name="observer"></param>public virtual void RemoveObserver(Observer observer){observers.Remove(observer);}}
internal class Subject: SubjectBase{}

        2.Observer观察者抽象类

    /// <summary>/// 观察者抽象类/// </summary>internal abstract class Observer{protected SubjectBase _subject;/// <summary>/// 更新消息/// </summary>public abstract void Update(object? sender, EventArgs eventArgs);public virtual void SetSubject(SubjectBase subject){if (subject == _subject) return;if (this._subject != null){this._subject.RemoveObserver(this);this._subject.NotifyAllHandler -= Update;}this._subject = subject;this._subject.AttachObserver(this);this._subject.NotifyAllHandler += Update;}}

        3.具体观察者,需要继承Observer基类

internal class Observer_A : Observer{public override void Update(object? sender, EventArgs eventArgs){Console.WriteLine($"Observer_A");}}internal class Observer_B : Observer{public override void Update(object? sender, EventArgs eventArgs){Console.WriteLine($"Observer_B");}}

调用

// 发布类
SubjectBase subject = new Subject();// 观察者
Observer observerA = new Observer_A();
observerA.SetSubject(subject);
Observer observerB = new Observer_B();
observerB.SetSubject(subject);// 发布类间隔通知
await Task.Run(() =>
{while (true){subject.NotifyAllObserver();Console.WriteLine("====================================================");Thread.Sleep(3000);}
});

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

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

相关文章

JAVA版鸿鹄云商B2B2C:解析多商家入驻直播带货商城系统的实现与应用

一、技术选型 java开发语言&#xff1a;java是一种跨平台的编程语言&#xff0c;适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架&#xff1a;spring boot是一个快速构建spring应用的框架&#xff0c;简化了开发过程&#xf…

点积相似性(Dot Product Similarity)

点积相似性&#xff08;Dot Product Similarity&#xff09;是一种计算两个向量之间相似性的方法。对于两个向量 a 和 b&#xff0c;它们的点积相似性定义为它们对应元素的乘积之和 其中&#xff0c;和 分别表示向量 和 的第 个元素&#xff0c; 是向量的长度。点积相似性的计…

独立容器 Rancher Server 证书过期解决

问题 Rancher无法登录 容器报错X509&#xff1a;certificate has expired or is not ye valid 在某天需要发布新版本的时候&#xff0c;发现rancher无法登录&#xff0c;于是到服务器上查看rancher日志&#xff0c;发现以下内容&#xff1a; docker logs -f rancher --since10…

性能测试之脚本、工具、结果分析总结

1、脚本模板 2、 场景模板 性能测试工具选择 1. 数据建模工具 DataFactory是一种强大的数据产生器&#xff0c;它允许开发人员和QA很容易产生百万行有意义的正确的测试数据库,该工具支持DB2、Oracle 、 Sybase、SQL Server数据库&#xff0c;支持ODBC连接方式&#xff0c…

matlab列优先与高维矩阵重构

由于matlab在列化a(:)以及reshape(a)等操作中是列优先的&#xff0c;所以要重构出新的高维度矩阵&#xff0c;通常要把reshape和permute结合起来使用。 先到 http://caffe.berkeleyvision.org/ 下载 训练好的model bvlc_reference_caffenet.caffemodel; 更多caffe使用也请参看…

泰迪智能科技“供需对接就业育人项目”介绍

为帮助用人单位培养和招聘更多实用型、复合型和紧缺型人才,推动高校人才培养与就业有机联动、人才供需有效对接促进高校毕业生更加充分更高质量就业&#xff0c;经广东泰迪智能科技股份有限公司申报、全国高校毕业生就业创业指导委员会专家组审核&#xff0c;泰迪智能科技“供需…

前端开发中HTTP状态码的含义和用途,以及常见错误码产生的原因和解决方法

一、HTTP状态码含义 http状态码一般是由3位数字组成的。代表服务器向客户端返回的响应状态。通过它们我们可以看出请求是否成功&#xff0c;还能判断服务器是否遇到了错误等情况。 HTTP状态码是Web开发中非常重要的组成部分&#xff0c;它们提供了服务器对客户端请求的响应状…

FlinkSQL窗口实例分析

Windowing TVFs Windowing table-valued functions (Windowing TVFs)&#xff0c;即窗口表值函数 注意&#xff1a;窗口函数不可以单独使用&#xff0c;需要聚合函数&#xff0c;按照 window_start、window_end 分区&#xff0c;即存在&#xff1a;group by window_start,wind…

适合当代年轻人做的副业分享,可以长期发展

年轻人精力旺盛&#xff0c;学习能力强&#xff0c;有创新&#xff0c;且处于不断上升阶段&#xff0c;所以副业要选择能成长&#xff0c;长期可靠的&#xff0c;既可以赚钱&#xff0c;又可以提升自己&#xff0c;一举两得&#xff01; 而在这其中&#xff0c;有一些副业活动不…

编程笔记 GOLANG基础 001 为什么要学习Go语言

编程笔记 GOLANG基础 001 为什么要学Go语言 一、推荐学习的计算机程序设计语言&#xff08;一&#xff09;、前端设计与编程&#xff1a;htmlcssjavascripttypescript&#xff08;二&#xff09;、C/C语言&#xff08;三&#xff09;、Go语言&#xff08;四&#xff09;、Pytho…

python3处理docx并flask显示

前言&#xff1a; 最近有需求处理docx文件&#xff0c;并讲内容显示到页面&#xff0c;对world进行在线的阅读&#xff0c;这样我这里就使用flaskDocument对docx文件进行处理并显示&#xff0c;下面直接上代码&#xff1a; Document处理&#xff1a; 首先下载Document的库文…

kubeadm 快速搭建

二进制搭建适合大集群&#xff0c;50台以上的主机 kubeadm更适合中下企业的业务集群。 master docker kubelet bubeadm kubectl flannel node1 docker kubelet bubeadm kubectl flannel node2 docker kubelet bubeadm kubectl flannel harbor节点&#xff1a;docker docker…

排列组合算法(升级版)

前言 在上一期博客中我们分享了一般的排列组合算法&#xff08;没看的话点这里哦~&#xff09;&#xff0c;但是缺点很明显&#xff0c;没法进行取模运算&#xff0c;而且计算的范围十分有限&#xff0c;而今天分享的排列组合升级版算法能够轻松解决这些问题&#xff0c;话不多…

【汇编笔记】初识汇编-内存读写

汇编语言的由来&#xff1a; CPU是计算机的核心&#xff0c;由于计算机只认识二进制&#xff0c;所以CPU执行的指令是二进制。 我们要想让CPU工作&#xff0c;就得给他提供它认识的指令&#xff0c;这一系列的指令的集合&#xff0c;称之为指令集。 指令集&#xff1a; 不同的体…

2023/12/3 今日得先看的重磅AI新闻

&#x1f4f1; 传 iPhone 设计主管加盟苹果前首席设计师公司&#xff0c;与 OpenAI 合作开发 AI 设备 &#x1f697; 雷军宣布&#xff1a;小米澎湃 OS 启动新标识&#xff0c;「人车家全生态」正式闭环 &#x1f527; OpenAI 竞争对手 Anthropic 预计明年年化营收将达到 8.5…

教育行业:真正有头脑的人,都在用这个巡课技术!

随着教育技术的迅猛发展&#xff0c;学校管理面临着日益复杂的挑战。在线巡课系统作为一种强大的工具&#xff0c;为学校管理者提供了更高效、精准的管理手段。 客户案例 中学巡课项目 河南某中学引入了泛地缘科技推出的在线巡课系统&#xff0c;实现了对教学过程的全面监管。…

[大厂实践] DoorDash基于eBPF的监控实践

eBPF是监控云原生应用的强大工具&#xff0c;本文介绍了DoorDash构建基于eBPF的监控系统的实践。原文: BPFAgent: eBPF for Monitoring at DoorDash 随着DoorDash在过去几年中经历了快速增长&#xff0c;我们开始看到传统监控方法的局限性。度量、日志和跟踪提供了服务生态系统…

Kernel:编译:剪裁

Linux内核的利用&#xff0c;有很大一部分是要做剪裁功能&#xff0c;来缩减内核所占的空间&#xff0c;以适应嵌入式环境的种种场景。或者以适应不同的架构。 其中一个主要的剪裁实现是通过编译配置&#xff0c;去除内核里不一样的功能&#xff1b;如RHEL的最终的编译配置文件…

数据结构第0章 初识

名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 0、思维导图1、数据结构1&#xff09;数据结构是什么&am…

Flink1.17实战教程(第六篇:容错机制)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…