C# 怎么实现一个观察者模式_C# 观察者模式实现方法详解

煙雲
发布: 2025-11-03 13:25:02
原创
645人浏览过
C#中实现观察者模式的核心是定义主题与观察者,通过接口、事件或IObservable方式实现状态变更时的自动通知,适用于事件驱动场景。

c# 怎么实现一个观察者模式_c# 观察者模式实现方法详解

在 C# 中实现观察者模式,核心是定义一个被观察对象(主题)和多个观察者,当主题状态发生变化时,自动通知所有注册的观察者。这种设计模式非常适合处理事件驱动的场景,比如 UI 更新、消息广播等。

观察者模式的基本结构

观察者模式包含两个主要角色:

  • Subject(主题):维护观察者列表,提供注册、注销和通知方法。
  • Observer(观察者):实现一个更新接口,用于接收主题的通知。

在 C# 中,可以通过接口和委托两种方式来实现。下面分别介绍具体做法。

使用接口手动实现观察者模式

定义观察者和主题接口,让具体类实现它们。

示例代码:

// 观察者接口
public interface IObserver
{
    void Update(string message);
}
<p>// 主题接口
public interface ISubject
{
void Attach(IObserver observer);
void Detach(IObserver observer);
void Notify(string message);
}</p><p>// 具体主题
public class NewsAgency : ISubject
{
private List<IObserver> _observers = new List<IObserver>();</p><pre class='brush:php;toolbar:false;'>public void Attach(IObserver observer) => _observers.Add(observer);
public void Detach(IObserver observer) => _observers.Remove(observer);

public void Notify(string news)
{
    foreach (var observer in _observers)
    {
        observer.Update(news);
    }
}

// 模拟新闻发布
public void PublishNews(string news)
{
    Console.WriteLine($"新闻机构发布:{news}");
    Notify(news);
}
登录后复制

}

// 具体观察者 public class NewsChannel : IObserver { private string _name;

public NewsChannel(string name) => _name = name;

public void Update(string message)
{
    Console.WriteLine($"{_name} 收到新闻:{message}");
}
登录后复制

}

使用示例:

var agency = new NewsAgency();
var channelA = new NewsChannel("央视");
var channelB = new NewsChannel("凤凰");
<p>agency.Attach(channelA);
agency.Attach(channelB);</p><p>agency.PublishNews("今日天气晴朗");</p><p>// 输出:
// 新闻机构发布:今日天气晴朗
// 央视 收到新闻:今日天气晴朗
// 凤凰 收到新闻:今日天气晴朗</p>
登录后复制

利用 C# 委托和事件简化实现

C# 的事件机制天生适合观察者模式。通过 eventdelegate,可以更简洁地实现松耦合通信。

示例代码:

public class Stock
{
    // 定义委托
    public delegate void PriceChangedHandler(string symbol, double price);
<pre class='brush:php;toolbar:false;'>// 定义事件
public event PriceChangedHandler PriceChanged;

private string _symbol;
private double _price;

public Stock(string symbol, double price)
{
    _symbol = symbol;
    _price = price;
}

public double Price
{
    get => _price;
    set
    {
        _price = value;
        OnPriceChanged(); // 触发事件
    }
}

protected virtual void OnPriceChanged()
{
    PriceChanged?.Invoke(_symbol, _price);
}
登录后复制

}

观察者订阅事件:

千帆大模型平台
千帆大模型平台

面向企业开发者的一站式大模型开发及服务运行平台

千帆大模型平台 0
查看详情 千帆大模型平台

var stock = new Stock("AAPL", 150.0);
<p>// 订阅事件
stock.PriceChanged += (symbol, price) =>
{
Console.WriteLine($"股票 {symbol} 价格变更为:{price}");
};</p><p>stock.Price = 155.0; // 输出:股票 AAPL 价格变更为:155</p>
登录后复制

这种方式更符合 C# 的编程习惯,代码更简洁,且线程安全由语言机制部分保障。

使用 IObservable 和 IObserver 接口(响应式扩展)

C# 还提供了内置的 IObservable<T>IObserver<T> 接口,属于 .NET 的响应式扩展(Reactive Extensions, Rx),适用于更复杂的异步数据流场景。

public class Sensor : IObservable<double>
{
    private List<IObserver<double>> _observers = new List<IObserver<double>>();
<pre class='brush:php;toolbar:false;'>public IDisposable Subscribe(IObserver<double> observer)
{
    if (!_observers.Contains(observer))
        _observers.Add(observer);

    return new Unsubscriber(_observers, observer);
}

public void Measure(double value)
{
    foreach (var observer in _observers)
        observer.OnNext(value);
}

private class Unsubscriber : IDisposable
{
    private List<IObserver<double>> _observers;
    private IObserver<double> _observer;

    public Unsubscriber(List<IObserver<double>> observers, IObserver<double> observer)
    {
        _observers = observers;
        _observer = observer;
    }

    public void Dispose()
    {
        _observers.Remove(_observer);
    }
}
登录后复制

}

使用方式:

var sensor = new Sensor();
<p>var observer = new MyObserver();
var subscription = sensor.Subscribe(observer);</p><p>sensor.Measure(23.5); // 触发通知</p><p>subscription.Dispose(); // 取消订阅</p>
登录后复制

其中 MyObserver 需要实现 IObserver<double> 接口。

基本上就这些。C# 提供了多种实现观察者模式的方式:手动接口实现适合学习原理,事件机制最常用也最自然,而 IObservable 则适用于高级异步场景。选择哪种方式取决于项目复杂度和需求。

以上就是C# 怎么实现一个观察者模式_C# 观察者模式实现方法详解的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号