c#观察者模式
时间: 2025-04-10 11:56:13 浏览: 28
<think>好的,我现在要回答用户关于C#中观察者模式的实现和用法的问题。首先,我需要回顾一下用户提供的引用资料,确保回答准确。引用2提到观察者模式定义了一对多的依赖关系,使用委托和事件来实现。引用3和4给出了具体的实现示例,引用5提到了潜在的问题和适用场景。
首先,我应该明确观察者模式的结构,包括Subject和Observer。C#中通常用事件和委托来实现,这样更简洁。需要解释委托和事件在其中的作用,比如委托作为事件类型,事件用于通知观察者。然后,给出一个具体的代码示例,比如温度监测的例子,这样用户容易理解。
接下来,要分步骤说明实现过程。可能包括定义Subject类,添加事件,然后在Observer中订阅事件。代码示例需要符合规范,使用中文注释,但代码本身是英文,保持原样。要注意事件声明的语法,比如使用EventHandler委托,或者自定义的委托类型。
然后,要提到观察者模式的优势,如解耦、灵活性,以及可能的注意事项,比如内存泄漏(如果观察者没有正确取消订阅)。引用5提到了性能问题和内存泄漏,这部分需要强调。
用户可能还关心实际应用场景,比如GUI事件处理、数据监控等,引用中的案例可以参考。同时,可能需要对比其他实现方式,比如接口方式,但C#中事件更常用,所以主要展示事件的方式。
最后,确保回答结构清晰,分点说明,代码用正确的格式,并生成相关问题。检查引用标注是否正确,比如每个引用来源在回答中的引用标识是否对应。</think>### C# 观察者模式实现与示例
观察者模式通过**事件驱动机制**实现对象间的一对多依赖关系,允许被观察对象(Subject)状态变化时自动通知所有观察者(Observer)。在C#中,借助**委托**和**事件**可简化其实现[^2][^4]。
---
#### 一、核心实现步骤
1. **定义被观察者(Subject)**
- 声明事件(使用`event`关键字)
- 提供事件注册(`+=`)与注销(`-=`)方法
- 在状态变化时触发事件
2. **定义观察者(Observer)**
- 订阅Subject的事件(通过`+=`)
- 实现事件触发时的响应逻辑
---
#### 二、示例:温度监测系统
```csharp
// 被观察者:温度传感器
public class TemperatureSensor
{
// 1. 定义事件(使用EventHandler委托)
public event EventHandler<TemperatureChangedEventArgs> TemperatureChanged;
// 2. 触发事件的方法
protected virtual void OnTemperatureChanged(float newTemp)
{
TemperatureChanged?.Invoke(this, new TemperatureChangedEventArgs(newTemp));
}
// 模拟温度变化
public void SimulateTemperatureChange(float temp)
{
Console.WriteLine($"温度更新:{temp}℃");
OnTemperatureChanged(temp);
}
}
// 事件参数类
public class TemperatureChangedEventArgs : EventArgs
{
public float NewTemperature { get; }
public TemperatureChangedEventArgs(float temp)
{
NewTemperature = temp;
}
}
// 观察者:显示屏
public class DisplayScreen
{
// 订阅事件
public void Subscribe(TemperatureSensor sensor)
{
sensor.TemperatureChanged += HandleTemperatureChange;
}
// 事件处理逻辑
private void HandleTemperatureChange(object sender, TemperatureChangedEventArgs e)
{
Console.WriteLine($"显示屏:当前温度已更新为 {e.NewTemperature}℃");
}
}
// 使用示例
var sensor = new TemperatureSensor();
var screen = new DisplayScreen();
screen.Subscribe(sensor);
sensor.SimulateTemperatureChange(25.5f); // 触发事件
sensor.SimulateTemperatureChange(26.0f);
```
---
#### 三、模式优势
1. **解耦**:Subject与Observer无直接依赖,仅通过事件交互[^3]。
2. **动态订阅**:可运行时增减观察者(通过`+=`/`-=`)。
3. **复用性**:符合开放-封闭原则,新增观察者无需修改Subject[^5]。
---
#### 四、注意事项
1. **内存泄漏**:若未及时取消订阅(`-=`),Observer可能无法被GC回收[^5]。
2. **线程安全**:多线程环境下需确保事件触发的线程安全。
3. **性能开销**:大量观察者时,事件遍历调用可能影响性能。
---
#### 五、典型应用场景
- GUI控件事件(如按钮点击)
- 数据监控系统(如股票价格变化)
- 分布式系统状态同步
---
阅读全文
相关推荐
















