您的位置:首页 >C#观察者模式实现方法 C#设计模式教程
发布于2026-03-14 阅读(0)
扫一扫,手机访问
C#中首选IObservable/IObserver实现观察者模式,语义清晰、线程安全基础好、支持取消订阅与异常传递;事件适合快速原型;自定义委托适合教学或特殊调度。

在C#中实现观察者模式,核心是定义“被观察者(Subject)”和“观察者(Observer)”,让多个观察者能动态订阅、接收被观察者状态变化的通知。.NET 原生提供了 IObservable<T> 和 IObserver<T> 接口,是最轻量、标准且推荐的方式——无需手写事件委托或自定义接口,也天然支持取消订阅和异常传递。
这是最符合 .NET 理念的写法,语义清晰、线程安全基础好、可组合性强(配合 System.Reactive 可进一步增强)。
IObservable<T>,通常返回一个包装了订阅逻辑的对象(如 Observable.Create<T>())IObserver<T>,重写 OnNext(接收数据)、OnError(处理异常)、OnCompleted(通知结束)Subscribe() 建立连接;返回的 IDisposable 可用于主动取消订阅示例:温度传感器模拟
// 被观察者:温度数据源 var temperatureSource = Observable.Create(observer => { var timer = new Timer(_ => { var temp = 20 + new Random().NextDouble() * 10; observer.OnNext(temp); }, null, TimeSpan.Zero, TimeSpan.FromSeconds(2)); return () => timer.Dispose(); // 取消时释放资源});
// 观察者:控制台显示 var subscription = temperatureSource.Subscribe( temp => Console.WriteLine($"当前温度:{temp:F2}°C"), ex => Console.WriteLine($"错误:{ex.Message}"), () => Console.WriteLine("传感器已关闭") );
// 5秒后取消订阅 await Task.Delay(5000); subscription.Dispose(); // 主动断开,timer 也会被释放
适合入门理解或轻量场景,代码直观,但需手动管理订阅列表、线程安全、异常隔离等细节。
public event EventHandler<TemperatureEventArgs> TemperatureChanged;EventArgs,携带通知数据(如温度值)TemperatureChanged?.Invoke(this, new TemperatureEventArgs(temp));sensor.TemperatureChanged += OnTemperatureChanged; 订阅注意:多线程下需加锁或使用 EventHandlerList;事件不提供取消订阅外的生命周期控制。
比事件更灵活,便于批量操作或条件过滤,但失去事件的封装性和编译时安全(比如不能用 -= 安全移除匿名方法)。
private readonly List<Action<double>> _observers = new();Subscribe(Action<double> action) 和 Unsubscribe(Action<double> action)action(temp);建议捕获异常避免一个失败影响其他观察者无论哪种实现,都要重视三点:
Subscribe/Unsubscribe 和通知过程线程安全(可用 ConcurrentBag 或锁)IObserver 的 OnError 已做分离,手写方案需 try/catch 包裹每个调用基本上就这些。用 IObservable/IObserver 是现代 C# 的首选,简洁、健壮、可扩展;事件适合快速原型;自定义委托适合教学或特殊调度需求。
上一篇:虫虫漫画追更提醒与书架管理入口
下一篇:C++开发简易记事本教程
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9