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语句,详细阐述了如何异步地迭代数据流。异步流为处理大量数据或需要流式处理数据的场景提供了一种高效且非阻塞性的方法,使得开发者能够更优雅地处理并发和数据流问题。
关于Dev 控件里 gridcontrol 的gridview 显示序号和checkbox
关于Dev 控件里 gridcontrol 的gridview 显示序号和checkbox
|
C# 图形学 Windows
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
两行代码就能实现Form窗体的(背景)透明效果,它不是Opacity属性的整个窗体透明,`TransparencyKey`实现窗体的透明、窗体中间部分镂空效果...
5160 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
阿里巴巴开发规约之代码格式
    1.如果括大号内没内容那么不换行,     2.小括号变量不能与括号有空格     3.如果/对/同时/开关/做保留等字与括号之间必须加空格     4.
1917 0
|
API
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果。前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html
1496 0
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
|
6月前
|
人工智能 IDE Shell
Zed IDE这个终端新功能,治好了我的窗口切换焦虑
Zed IDE近期发布多项重磅更新,尤其新增“New Center Terminal”功能,让终端可直接在编辑区并排打开,告别拖拽拼图式操作。本文详解其双终端模式、心流提升逻辑及开源协作精神,并展望AI驱动的智能终端未来。(239字)
522 2
|
网络协议 网络安全 Docker
Docker Swarm 解决报错Error response from daemon: rpc error: code = Unavailable desc = connection error:
本文是博主学习docker swarm遇到的问题记录,希望对大家有所帮助。
2554 0
Docker Swarm 解决报错Error response from daemon: rpc error: code = Unavailable desc = connection error:
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
1140 0
|
开发框架 前端开发 JavaScript
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
|
安全 jenkins 持续交付
蓝易云 - jenkins配置权限不对导致无法登陆的重置方法
以上步骤可以帮助你重置Jenkins的权限配置,使你可以再次登录。但请注意,这样做会关闭所有的安全设置,包括身份验证和授权。在重新配置正确的权限设置之后,不要忘记将"useSecurity"设置回"true"。
732 1