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;
相关文章
|
2天前
|
存储 安全 C#
C# 数组与集合:List<T> 最常用场景
数组长度固定,集合(List&lt;T&gt;)可动态增删,支持泛型与类型安全。常用操作包括添加、删除、遍历和查询元素,是开发中首选的动态数据存储方式。
|
2天前
|
存储 开发框架 缓存
C# 实现图片验证码的 WebAPI 版(ASP.NET Core)
基于ASP.NET Core实现的验证码服务,生成带干扰线和随机旋转文字的4位图文验证码,支持内存存储与验证。需安装System.Drawing.Common包。
|
2天前
|
C# 索引
C# 循环结构:for/foreach/while 效率对比
循环用于重复执行代码,根据场景选择:for 适合已知次数,foreach 简洁遍历集合,while 适用于条件控制。示例演示遍历商品价格列表并计算总和,展示三种循环的用法与差异。(239字)
|
2天前
|
存储 缓存 安全
C# 实现带过期时间的本地缓存工具
基于ConcurrentDictionary与定时清理机制,实现线程安全的本地缓存,支持键值过期自动清除。每分钟扫描并移除过期项,有效防止内存溢出,适用于需短暂存储数据的场景,如用户会话、临时配置等,保障性能与稳定性。
|
2天前
|
C#
C# 实现简单的 Excel 数据写入工具
基于EPPlus库实现C#将数据写入Excel文件,支持自定义表头与多行数据,自动调整列宽,操作简便,适用于非商业场景的数据导出需求。
|
2天前
|
存储 C#
C# 实现简单的备忘录模式
备忘录模式在不破坏封装性的前提下,捕获并保存对象的内部状态,以便后续恢复。通过原发器创建备忘录,管理者存储备忘录,可实现状态回滚。
|
2天前
|
C#
C# 条件判断:if-else 与 switch 的实用场景
条件判断是流程控制的核心。if-else适用于多级条件判断,如根据积分决定会员等级;switch适用于多值匹配,C# 7.0+支持字符串和数值匹配,可清晰处理会员等级对应的优惠策略。
|
2天前
|
安全 C#
C# 实现简单的单例模式(懒汉式)
单例模式确保一个类仅存在一个实例,并提供全局访问点。通过私有构造函数防止外部实例化,结合静态属性和延迟初始化实现线程安全的唯一实例,常用于日志、配置管理等场景。
|
2天前
|
算法 C#
C# 实现简单的策略模式
策略模式定义算法族,封装可互换的算法,使算法变化独立于客户端。通过接口统一调用,支持动态切换排序方式,如冒泡排序与快速排序,提升系统灵活性与可扩展性。
|
2天前
|
缓存 安全 C#
C# 实现简单的缓存工具类
基于Dictionary实现线程安全的内存缓存,支持设置过期时间,自动清理过期项。同时提供枚举转键值对列表工具,便于下拉框数据绑定,提升开发效率。

热门文章

最新文章