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`实现窗体的透明、窗体中间部分镂空效果...
4620 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
|
24天前
|
存储 算法 C#
C# 哈希值计算:MD5/SHA256 加密
本示例展示了C#中使用MD5和SHA256算法生成哈希值的方法,适用于密码加密与数据校验。MD5安全性较低,建议仅用于非敏感场景;密码存储推荐使用SHA256配合盐值以增强安全性。
|
24天前
|
JSON C# 数据格式
C# 实现简单的 HTTP 请求工具(POST 补充)
该代码实现了一个基于 HttpClient 的异步 HTTP POST 请求工具类,支持以 JSON 格式提交数据并反序列化响应结果,具备异常处理机制,适用于 .NET 环境下的轻量级网络请求操作。
|
24天前
|
JSON C# 数据格式
C# JSON 序列化与反序列化:Newtonsoft.Json 用法
JSON是前后端交互常用格式,Newtonsoft.Json(Json.NET)是C#中最流行的JSON处理库。本文介绍如何使用它实现对象与JSON字符串的序列化和反序列化,并提供封装工具类及调用示例,便于在项目中快速集成与使用。
|
24天前
|
JSON API C#
C# 实现简单的 HTTP 请求工具(GET/POST)
HTTP请求工具用于调用第三方API,支持GET和POST方法,实现数据获取与提交。示例代码展示通过HttpClient发送异步POST请求,处理响应并解析JSON结果,适用于高效集成外部服务。
|
24天前
|
C#
C# 实现发送邮件功能(SMTP)
通过SMTP协议实现邮件发送,支持文本与附件,需配置邮箱SMTP信息(如QQ邮箱授权码)。示例代码展示C#中如何使用SmtpClient发送邮件,适用于QQ、163、Gmail等主流邮箱服务。
|
24天前
|
缓存 安全 C#
C# 实现简单的缓存工具类
基于Dictionary实现线程安全的内存缓存,支持设置过期时间,自动清理过期项。同时提供枚举转键值对列表工具,便于下拉框数据绑定,提升开发效率。
|
24天前
|
C#
C# 利用特性(Attribute)实现自定义验证
通过自定义特性(如RequiredAttribute)标记类属性,利用反射实现数据验证逻辑。示例代码展示了如何在对象中检查必填字段,并输出验证错误信息,实现灵活的数据校验机制。
|
24天前
|
Java C#
C# 实现简单的线程池工具
使用 `ThreadPool` 管理多线程任务,有效控制并发数量,避免因线程过多导致系统性能下降。通过示例代码演示如何提交任务、跟踪完成状态,并等待所有任务结束,提升资源利用率和程序稳定性。

热门文章

最新文章