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

C#中实现观察者模式的核心是定义主题与观察者,通过接口、事件或IObservable方式实现状态变更时的自动通知,适用于事件驱动场景。

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

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

观察者模式的基本结构

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

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

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

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

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

示例代码:

// 观察者接口public interface IObserver{    void Update(string message);}

// 主题接口public interface ISubject{void Attach(IObserver observer);void Detach(IObserver observer);void Notify(string message);}

// 具体主题public class NewsAgency : ISubject{private List _observers = new List();

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("凤凰");

agency.Attach(channelA);agency.Attach(channelB);

agency.PublishNews("今日天气晴朗");

// 输出:// 新闻机构发布:今日天气晴朗// 央视 收到新闻:今日天气晴朗// 凤凰 收到新闻:今日天气晴朗

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

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

示例代码:

public class Stock{    // 定义委托    public delegate void PriceChangedHandler(string symbol, double price);
// 定义事件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);}

}

观察者订阅事件:

var stock = new Stock("AAPL", 150.0);

// 订阅事件stock.PriceChanged += (symbol, price) =>{Console.WriteLine($"股票 {symbol} 价格变更为:{price}");};

stock.Price = 155.0; // 输出:股票 AAPL 价格变更为:155

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

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

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

public class Sensor : IObservable{    private List<IObserver> _observers = new List<IObserver>();
public IDisposable Subscribe(IObserver 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> _observers;    private IObserver _observer;    public Unsubscriber(List<IObserver> observers, IObserver observer)    {        _observers = observers;        _observer = observer;    }    public void Dispose()    {        _observers.Remove(_observer);    }}

}

使用方式:

var sensor = new Sensor();

var observer = new MyObserver();var subscription = sensor.Subscribe(observer);

sensor.Measure(23.5); // 触发通知

subscription.Dispose(); // 取消订阅

其中 MyObserver 需要实现 IObserver 接口。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441203.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 17:50:43
下一篇 2025年12月17日 17:51:03

相关推荐

发表回复

登录后才能评论
关注微信