当前位置: 首页 > 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);}
});

相关文章:

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

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

ARM CCA机密计算软件架构之软件堆栈概述

Arm CCA平台通过硬件添加和固件组件的混合方式实现,例如在处理元素(PEs)中的RME以及特定的固件组件,特别是监视器和领域管理监视器。本节介绍Arm CCA平台的软件堆栈。 软件堆栈概述 领域VM的执行旨在与Normal world(正常世界)隔离,领域VM由Normal world Host(正常世界…...

《Python机器学习原理与算法实现》学习笔记

以下为《Python机器学习原理与算法实现》&#xff08;杨维忠 张甜 著 2023年2月新书 清华大学出版社&#xff09;的学习笔记。 根据输入数据是否具有“响应变量”信息&#xff0c;机器学习被分为“监督式学习”和“非监督式学习”。 “监督式学习”即输入数据中即有X变量&…...

k8s集群通过helm部署skywalking

1、安装helm 下载脚本安装 ~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 ~# chmod 700 get_helm.sh ~# ./get_helm.sh或者下载包进行安装 ~# wget https://get.helm.sh/helm-canary-linux-amd64.tar.gz ~# mv helm …...

介绍一款PDF在线工具

PDF是我们日常工作中的一种常见格式&#xff0c;其处理也是我们工作的重要基础性环节&#xff0c;一款可靠的处理工具显得十分重要。 完全免费、易于使用、丰富的PDF处理工具&#xff0c;包括&#xff1a;合并、拆分、压缩、转换、旋转和解锁PDF文件&#xff0c;以及给PDF文件…...

docker学习——汇总版

历时一个月将docker系统的学习了一下&#xff0c;并且记录了详细的笔记和实践过程。 希望能对工作需要的小伙伴们有所帮助~ docker基础篇 docker学习&#xff08;一、docker与VM对比&#xff09; docker学习&#xff08;二、安装docker&#xff09; docker学习&#xff08;…...

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展&#xff0c;数据规模指数级膨胀&#xff0c;对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板&#xff0c;只能适应有限的场景&#xff1a; >> 新型分布式…...

16-网络安全框架及模型-BiBa完整性模型

目录 BiBa完整性模型 1 背景概述 2 模型原理 3 主要特性 4 优势和局限性 5 应用场景 BiBa完整性模型 1 背景概述 Biba完整性模型是用于保护数据完整性的模型&#xff0c;它的主要目标是确保数据的准确性和一致性&#xff0c;防止未授权的修改和破坏。在这个模型中&#…...

ssm基于冲突动态监测算法的健身房预约系统的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装健身房预约系统软件来发挥其高效地信息处理的作用&#xff…...

基于 Element UI 适用于 Vue 2 版本的虚拟列表选择器组件el-select

背景&#xff1a;在某些使用情况下&#xff0c;单个选择器可能最终加载数万行数据。 将这么多的数据渲染至 DOM 中可能会给浏览器带来负担&#xff0c;从而造成性能问题。 ——vue3element-plus有现成的轮子。而vue2element-ui没有。 以下 文章大部分 摘自 源组件中的README.md…...

java常见面试题:请解释一下Java中的常用分布式框架,如Spring Boot、Dubbo等。

下面我将详细介绍Java中的两个常用分布式框架&#xff1a;Spring Boot和Dubbo。 1. Spring Boot Spring Boot是一个用于创建独立、可运行的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和部署&#xff0c;使得开发人员能够专注于编写业务逻辑&#xff0c…...

FreeRTOS列表与列表项相关知识总结以及列表项的插入与删除实战

1.列表与列表项概念及结构体介绍 1.1列表项简介 列表相当于链表&#xff0c;列表项相当于节点&#xff0c;FreeRTOS 中的列表是一个双向环形链表 1.2 列表、列表项、迷你列表项结构体 1&#xff09;列表结构体 typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VAL…...

07|输出解析:用OutputParser生成鲜花推荐列表

07&#xff5c;输出解析&#xff1a;用OutputParser生成鲜花推荐列表 模型 I/O Pipeline 下面先来看看 LangChain 中的输出解析器究竟是什么&#xff0c;有哪些种类。 LangChain 中的输出解析器 语言模型输出的是文本&#xff0c;这是给人类阅读的。但很多时候&#xff0c;你…...

cfa一级考生复习经验分享系列(十二)

背景&#xff1a;就职于央企金融机构&#xff0c;本科金融背景&#xff0c;一直在传统金融行业工作。工作比较忙&#xff0c;用了45天准备考试&#xff0c;几乎每天在6小时以上。 写在前面的话 先讲一下&#xff0c;整体一级考下来&#xff0c;我觉得知识点多&#xff0c;偏基础…...

【损失函数】SmoothL1Loss 平滑L1损失函数

1、介绍 torch.nn.SmoothL1Loss 是 PyTorch 中的一个损失函数&#xff0c;通常用于回归问题。它是 L1 损失和 L2 损失的结合&#xff0c;旨在减少对异常值的敏感性。 loss_function nn.SmoothL1Loss(reductionmean, beta1.0) 2、参数 size_average (已弃用): 以前用于确定是…...

Go语言中的HTTP重定向

大家好&#xff0c;我是你们可爱的编程小助手&#xff0c;今天我们要一起探讨如何使用Go语言实现HTTP重定向&#xff0c;让我们开始吧&#xff01; 大家都知道&#xff0c;网站开发中有时候需要将用户的请求从一个URL导向到另一个URL。比如说&#xff0c;你可能想将旧的URL结构…...

ORACLE P6 v23.12 最新虚拟机(VM)全套系统环境分享

引言 根据上周的计划&#xff0c;我简单制作了两套基于ORACLE Primavera P6 最新发布的23.12版本预构建了虚拟机环境&#xff0c;里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代…...

鸿蒙开发ArkTS基础学习-开发准备工具配置

文章目录 前言1. 准备工作2.开发文档3.鸿蒙开发路径一.详情介绍二.DevEco Studio安装详解-开发环境搭建2.1配置开发环境欢迎各位读者阅读本文,今天我们将介绍鸿蒙(HarmonyOS)应用开发的入门步骤,特别是在准备工作和开发环境搭建方面的重要信息。本文将对鸿蒙官方网站的关键…...

WEB 3D技术 three.js 雾 基础使用讲解

本文 我们说一下 雾 在three.js中有一个 Fog类 它可以创建线性雾的一个效果 她就是模仿现实世界中 雾的一个效果 你看到远处物体会组件模糊 直到完全被雾掩盖 在 three.js 中 有两种雾的形式 一种是线性的 一种是指数的 个人觉得 线性的会看着自然一些 他是 从相机位置开始 雾…...

Python中的网络编程

IP地址 IPv4IPv6查看本机的IP地址 win ipconfiglinux ifconfig ping命令 ping www.baidu.com 查看是否能连通指定的网站ping 192.168.1.222 查看是否能连通指定的IP Port端口 0-65535 TCP/IP协议 传输数据之前要建立连接&#xff0c;通过三次握手建立&#xff1a; 客户端 --&g…...

Performance-Fish:环世界性能优化的全方位解决方案

Performance-Fish&#xff1a;环世界性能优化的全方位解决方案 【免费下载链接】Performance-Fish Performance Mod for RimWorld 项目地址: https://gitcode.com/gh_mirrors/pe/Performance-Fish 问题诊断&#xff1a;环世界性能瓶颈深度剖析 &#x1f50d; AI决策系统…...

告别手动抄表!WinCC结合SQL Server和Excel,打造车间级设备运行数据看板

工业数据可视化实战&#xff1a;用WinCCSQL Server构建车间级智能看板 在制造业数字化转型浪潮中&#xff0c;车间设备数据的可视化呈现已成为提升生产效率的关键环节。传统的人工抄表方式不仅耗时耗力&#xff0c;更难以实现数据的实时分析和历史追溯。本文将介绍如何利用Win…...

别再为YOLOv5标签格式发愁了!手把手教你从COCO128.yaml到txt标签文件的完整配置流程

YOLOv5数据标注全流程实战&#xff1a;从配置文件解析到标签文件生成 刚接触目标检测的新手开发者们&#xff0c;常常在数据准备阶段就陷入迷茫——官方文档过于简略&#xff0c;社区教程又零散不全。本文将彻底解决这个痛点&#xff0c;带你一步步完成YOLOv5数据标注全流程&am…...

AI头像生成器实战:用Qwen3-32B为你的社交头像设计专属描述文案

AI头像生成器实战&#xff1a;用Qwen3-32B为你的社交头像设计专属描述文案 1. 为什么你需要一个AI头像生成器 在社交媒体时代&#xff0c;一个独特的头像已经成为个人品牌的重要组成部分。无论是LinkedIn上的专业形象&#xff0c;还是Instagram上的创意展示&#xff0c;头像都…...

【小白友好】Qwen2.5-VL-7B-Instruct快速上手:无需代码的图文智能问答工具

Qwen2.5-VL-7B-Instruct快速上手&#xff1a;无需代码的图文智能问答工具 1. 工具简介 Qwen2.5-VL-7B-Instruct是一款基于阿里通义千问多模态大模型的视觉交互工具&#xff0c;专为RTX 4090显卡优化。它最大的特点是完全可视化操作&#xff0c;无需编写任何代码就能实现强大的…...

iperf3网络性能测试工具完全指南:从安装到企业级应用

iperf3网络性能测试工具完全指南&#xff1a;从安装到企业级应用 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 在当今数字化时代&#xff0c;网络…...

如何高效突破AI编辑器限制:自动化Pro功能激活的技术实践

如何高效突破AI编辑器限制&#xff1a;自动化Pro功能激活的技术实践 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your t…...

TPAMI 2026 | 雨雾噪模糊全搞定!CPL 框架让图像复原告别单一任务限制

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达在日常拍摄中&#xff0c;一张照片可能同时遭遇噪声、雾霾、雨滴等多种退化问题&#xff0c;而传统图像复原方法要么只能处理单一退化类型&#xff0c;要么在多任务场景下…...

J1712-粒状巧克力糖包装机设计【颗粒状糖果包装机设计】【三维SW模型+6张CAD图纸+说明】

J1712-粒状巧克力糖包装机设计【颗粒状糖果包装机设计】【三维SW模型6张CAD图纸说明】 传送带电机刚启动那会儿&#xff0c;总有几个巧克力豆卡在导流槽边缘。凌晨三点的实验室里&#xff0c;我盯着SolidWorks里旋转的螺旋送料机构模型&#xff0c;突然意识到——这玩意儿得做成…...

揭秘C++多态:动态行为的核心奥秘

C 多态&#xff1a;面向对象的动态行为核心机制多态性是面向对象编程&#xff08;OOP&#xff09;的核心概念之一&#xff0c;它允许对象在运行时根据其实际类型表现出不同的行为。在C中&#xff0c;多态性主要通过虚函数&#xff08;virtual functions&#xff09;和继承机制实…...