C# 事件(Event):基于委托的观察者模式

简介: 事件是基于委托的封装机制,仅支持订阅与取消订阅,确保成员安全。常用于实现观察者模式,如订单状态变更时通知各系统,实现松耦合设计。

事件是委托的 “安全包装”,仅允许订阅(+=)和取消订阅(-=),避免外部直接调用,是观察者模式的常用实现。

案例:事件订阅与通知

// 定义委托(事件的底层委托)
public delegate void OrderStatusChangedDelegate(OrderStatus newStatus);
public class Order
{
    private OrderStatus _status;
    // 定义事件(基于委托)
    public event OrderStatusChangedDelegate OnStatusChanged;
    public OrderStatus Status
    {
        get => _status;
        set
        {
            if (_status != value)
            {
                _status = value;
                // 状态变化时触发事件
                OnStatusChanged?.Invoke(_status);
            }
        }
    }
}
// 观察者1:订单系统
public class OrderSystem
{
    public static void OnOrderStatusChanged(OrderStatus newStatus)
    {
        Console.WriteLine($"【订单系统】订单状态更新为:{newStatus}");
    }
}
// 观察者2:物流系统
public class LogisticsSystem
{
    public static void OnOrderStatusChanged(OrderStatus newStatus)
    {
        if (newStatus == OrderStatus.Paid)
        {
            Console.WriteLine($"【物流系统】订单已支付,开始备货!");
        }
        else if (newStatus == OrderStatus.Shipped)
        {
            Console.WriteLine($"【物流系统】订单已发货,跟踪物流信息!");
        }
    }
}
// 调用示例
Order order = new Order();
// 订阅事件(多个观察者)
order.OnStatusChanged += OrderSystem.OnOrderStatusChanged;
order.OnStatusChanged += LogisticsSystem.OnOrderStatusChanged;
// 修改订单状态(触发事件)
Console.WriteLine("=== 订单创建 ===");
order.Status = OrderStatus.Pending;
Console.WriteLine("\n=== 用户支付 ===");
order.Status = OrderStatus.Paid;
Console.WriteLine("\n=== 商家发货 ===");
order.Status = OrderStatus.Shipped;
// 取消订阅物流系统
order.OnStatusChanged -= LogisticsSystem.OnOrderStatusChanged;
Console.WriteLine("\n=== 订单送达 ===");
order.Status = OrderStatus.Delivered;
相关文章
|
编译器 数据处理 C#
C#中的异步流:使用IAsyncEnumerable<T>和await foreach实现异步数据迭代
【1月更文挑战第10天】本文介绍了C#中异步流的概念,并通过使用IAsyncEnumerable<T>接口和await foreach语句,详细阐述了如何异步地迭代数据流。异步流为处理大量数据或需要流式处理数据的场景提供了一种高效且非阻塞性的方法,使得开发者能够更优雅地处理并发和数据流问题。
|
C# 图形学 Windows
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
两行代码就能实现Form窗体的(背景)透明效果,它不是Opacity属性的整个窗体透明,`TransparencyKey`实现窗体的透明、窗体中间部分镂空效果...
4789 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
阿里巴巴开发规约之代码格式
    1.如果括大号内没内容那么不换行,     2.小括号变量不能与括号有空格     3.如果/对/同时/开关/做保留等字与括号之间必须加空格     4.
1789 0
|
3月前
|
C#
C# 随机数生成:Random 类用法
Random类用于生成伪随机数,适用于游戏、验证码、测试等场景。通过静态实例避免重复创建,确保随机性。提供整数、小数、布尔值及指定长度的随机字符串生成方法,使用简便且高效。注意需复用实例防止种子重复导致随机数相同。
|
存储 人工智能 安全
一文了解:阿里云对象存储OSS是什么?
阿里云对象存储OSS是一款海量、安全、低成本、高可靠的云存储服务,数据持久性达99.9999999999%,适用于互联网音视频、教育、AI/物联网、影视渲染及基因等行业。OSS提供标准、低频、归档等多种存储类型,支持按量付费与资源包两种计费模式,公网出流量收费,内网流量免费。
12689 7
STM32速成笔记(三)—按键检测
本文介绍了如何利用STM32进行按键检测,先介绍了原理,后面给出了配置步骤和应用例程。此外,本文还叙述了如何利用一个按键单独控制一个LED亮灭,以及如何检测按键长短按。
2887 0
STM32速成笔记(三)—按键检测
|
存储 算法 程序员
C++基础知识(八:STL标准库(Vectors和list))
C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等. STL容器的提供是为了让开发者可以更高效率的去开发,同时我们应该也需要知道他们的底层实现,这样在出现错误的时候我们才知道一些原因,才可以更好的去解决问题。
324 1
|
C# Python
C#如何用最简单方法调用Python?
本文介绍了如何在C#中通过命令行调用Python脚本,以解决Python.NET的版本兼容性和配置难题。方法是利用`System.Diagnostics.Process`类启动Python解释器并传递脚本路径。首先确保安装Python 3.0+,创建.NET控制台程序和Python测试脚本。然后,C#代码通过指定Python路径和脚本位置启动进程,重定向输出并读取结果。这种方法简单、依赖少,适合初学者,但可能牺牲性能,不适合频繁交互和处理大量数据。
740 1
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
2027 0
|
SQL 关系型数据库 MySQL
C++ ORM ODB入门
1.ORM ORM, Object Relational Mapping, 对象关系映射,用来将基于对象的数据结构映射到SQL的数据结构中。即将基于对象的数据映射到关系表中的字段,然后我们可以通过对象提供的接口来操作数据库,而无需写sql语句来操作数据库。
6745 0