C#观察者模式实现方法 C#设计模式教程
C#中首选IObservable/IObserver实现观察者模式,语义清晰、线程安全基础好、支持取消订阅与异常传递;事件适合快速原型;自定义委托适合教学或特殊调度。
C#中首选IObservable/IObserver实现观察者模式,语义清晰、线程安全基础好、支持取消订阅与异常传递;事件适合快速原型;自定义委托适合教学或特殊调度。

在C#中实现观察者模式,核心是定义“被观察者(Subject)”和“观察者(Observer)”,让多个观察者能动态订阅、接收被观察者状态变化的通知。.NET 原生提供了 IObservable 和 IObserver 接口,是最轻量、标准且推荐的方式——无需手写事件委托或自定义接口,也天然支持取消订阅和异常传递。
用 IObservable/IObserver 实现标准观察者
这是最符合 .NET 理念的写法,语义清晰、线程安全基础好、可组合性强(配合 System.Reactive 可进一步增强)。
- 被观察者需实现
IObservable,通常返回一个包装了订阅逻辑的对象(如Observable.Create)() - 观察者实现
IObserver,重写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 也会被释放
用事件(event)+ 自定义委托实现简易版
适合入门理解或轻量场景,代码直观,但需手动管理订阅列表、线程安全、异常隔离等细节。
- 在被观察者类中声明
public event EventHandlerTemperatureChanged; - 定义事件参数类继承
EventArgs,携带通知数据(如温度值) - 触发时调用
TemperatureChanged?.Invoke(this, new TemperatureEventArgs(temp)); - 观察者通过
sensor.TemperatureChanged += OnTemperatureChanged;订阅
注意:多线程下需加锁或使用 EventHandlerList;事件不提供取消订阅外的生命周期控制。
用泛型委托 Action 搭配 List 存储观察者
比事件更灵活,便于批量操作或条件过滤,但失去事件的封装性和编译时安全(比如不能用 -= 安全移除匿名方法)。
- 被观察者维护
private readonly List> _observers = new(); - 提供
Subscribe(Action和action) Unsubscribe(Actionaction) - 状态变更时遍历调用每个
action(temp);建议捕获异常避免一个失败影响其他观察者
关键注意事项
无论哪种实现,都要重视三点:
- 内存泄漏风险:事件或委托长期持有观察者引用,导致无法 GC;务必提供明确的取消机制并及时调用
- 线程安全:若通知可能跨线程触发(如定时器、Task),需确保
Subscribe/Unsubscribe和通知过程线程安全(可用ConcurrentBag或锁) - 异常隔离:一个观察者出错不应中断其他观察者的通知;标准
IObserver的OnError已做分离,手写方案需 try/catch 包裹每个调用
基本上就这些。用 IObservable/IObserver 是现代 C# 的首选,简洁、健壮、可扩展;事件适合快速原型;自定义委托适合教学或特殊调度需求。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













