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`实现窗体的透明、窗体中间部分镂空效果...
4952 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
阿里巴巴开发规约之代码格式
    1.如果括大号内没内容那么不换行,     2.小括号变量不能与括号有空格     3.如果/对/同时/开关/做保留等字与括号之间必须加空格     4.
1842 0
|
搜索推荐 API
【强烈推荐使用】免费在线使用 GPT-4 | Free GPT-4 Online
这是一个无需API密钥的在线GPT-4工具,用户可直接输入消息进行交互。特色功能包括:重试按钮、Prompt菜单、重新开始对话及设置选项(如随机性调整和历史消息数选择),提供个性化和高效交流体验。详情见个人主页简介。
1426 5
【强烈推荐使用】免费在线使用 GPT-4 | Free GPT-4 Online
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
977 0
|
开发框架 前端开发 JavaScript
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
|
存储 算法 程序员
C++基础知识(八:STL标准库(Vectors和list))
C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等. STL容器的提供是为了让开发者可以更高效率的去开发,同时我们应该也需要知道他们的底层实现,这样在出现错误的时候我们才知道一些原因,才可以更好的去解决问题。
366 1
|
C# Python
C#如何用最简单方法调用Python?
本文介绍了如何在C#中通过命令行调用Python脚本,以解决Python.NET的版本兼容性和配置难题。方法是利用`System.Diagnostics.Process`类启动Python解释器并传递脚本路径。首先确保安装Python 3.0+,创建.NET控制台程序和Python测试脚本。然后,C#代码通过指定Python路径和脚本位置启动进程,重定向输出并读取结果。这种方法简单、依赖少,适合初学者,但可能牺牲性能,不适合频繁交互和处理大量数据。
881 1
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
2313 0

热门文章

最新文章