当前位置: 首页 > news >正文

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.lryc.cn/news/270391.html

相关文章:

  • ARM CCA机密计算软件架构之软件堆栈概述
  • 《Python机器学习原理与算法实现》学习笔记
  • k8s集群通过helm部署skywalking
  • 介绍一款PDF在线工具
  • docker学习——汇总版
  • 百度沧海文件存储CFS推出新一代Namespace架构
  • 16-网络安全框架及模型-BiBa完整性模型
  • ssm基于冲突动态监测算法的健身房预约系统的设计与实现论文
  • 基于 Element UI 适用于 Vue 2 版本的虚拟列表选择器组件el-select
  • java常见面试题:请解释一下Java中的常用分布式框架,如Spring Boot、Dubbo等。
  • FreeRTOS列表与列表项相关知识总结以及列表项的插入与删除实战
  • 07|输出解析:用OutputParser生成鲜花推荐列表
  • cfa一级考生复习经验分享系列(十二)
  • 【损失函数】SmoothL1Loss 平滑L1损失函数
  • Go语言中的HTTP重定向
  • ORACLE P6 v23.12 最新虚拟机(VM)全套系统环境分享
  • 鸿蒙开发ArkTS基础学习-开发准备工具配置
  • WEB 3D技术 three.js 雾 基础使用讲解
  • Python中的网络编程
  • uni-app js语法
  • 【论文阅读笔记】Detecting Camouflaged Object in Frequency Domain
  • Mysql(5日志备份恢复)
  • MR实战:实现数据去重
  • JVM 常用知识和面试题
  • 【教3妹学编程-算法题】一年中的第几天
  • ramdump 中的memory统计
  • Element-Ui树形数据懒加载,删除到最后一个空数组不刷新问题
  • 基于NASM搭建一个能编译汇编语言的汇编软件工具环境(利用NotePad++)
  • 使用setoolkit制作钓鱼网站并结合dvwa靶场储存型XSS漏洞利用
  • 计算机组成原理-总线概述