事件是委托的 “安全包装”,仅允许订阅(+=)和取消订阅(-=),避免外部直接调用,是观察者模式的常用实现。
案例:事件订阅与通知
// 定义委托(事件的底层委托) 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;