当前位置: 首页 > news >正文

C# 使用.NET内置的 IObservable<T> 和 IObserver<T>-观察者模式

 核心概念

  1. IObservable<T>

    1. 表示 可观察的数据源(如事件流、实时数据)。

    2. 关键方法:Subscribe(IObserver<T> observer),用于注册观察者。

  2. IObserver<T>

    1. 表示 数据的接收者,响应数据变化。

    2. 三个核心方法:

      1. OnNext(T value):接收新数据。

      2. OnError(Exception error):处理错误。

      3. OnCompleted():响应数据流结束。

观察者实现:

  public class 观察者 : IObserver<float>{public void OnNext(float price){Console.WriteLine($"最新股价: {price}$");}public void OnError(Exception ex){Console.WriteLine($"错误: {ex.Message}");}public void OnCompleted(){Console.WriteLine("股票数据流结束");}}

被观察者实现:

 public class 被观察者 : IObservable<float>{private List<IObserver<float>> _observers = new List<IObserver<float>>();public IDisposable Subscribe(IObserver<float> observer){_observers.Add(observer);return new Unsubscriber(_observers, observer);}//这段代码定义了一个 Unsubscriber 内部类,用于管理观察者(IObserver<T>)的订阅和取消订阅逻辑。//它的核心作用是 安全地从观察者列表中移除某个观察者,避免内存泄漏或无效通知。private class Unsubscriber : IDisposable{private List<IObserver<float>> _observers;private IObserver<float> _observer;public Unsubscriber(List<IObserver<float>> observers, IObserver<float> observer){_observers = observers;_observer = observer;}public void Dispose(){if (_observer != null && _observers.Contains(_observer))_observers.Remove(_observer);}}// 模拟股价变动public void UpdatePrice(float price){foreach (var observer in _observers){observer.OnNext(price);}}public void MarketClosed(){foreach (var observer in _observers){observer.OnCompleted();}}}

WInform调用案例:

    public partial class Form1 : Form{public Form1(){InitializeComponent();}观察者 A = new 观察者();被观察者 B = new 被观察者();IDisposable A回执;private void btn_观察_Click(object sender, EventArgs e){A回执 = B.Subscribe(A);}private void btn_取消观察_Click(object sender, EventArgs e){A回执.Dispose();}private void btn_价格一_Click(object sender, EventArgs e){B.UpdatePrice(1);}private void btn_价格二_Click(object sender, EventArgs e){B.UpdatePrice(2);}private void btn_股市关闭_Click(object sender, EventArgs e){B.MarketClosed();}}

相关文章:

  • Python对ppt进行文本替换、插入图片、生成表格
  • Spark中Maven的用法
  • 如何查看自己抖音的IP属地?详细教程及如何修改
  • Chromium 134 编译指南 macOS篇:安装 Xcode(二)
  • scikit-learn初探
  • 巧记英语四级单词 Unit4-中【晓艳老师版】
  • RagFlow本地部署教程 :多模态检索+动态生成,用AI重构企业知识生产力
  • 软件架构设计:MVC、MVP、MVVM、RIA 四大风格优劣剖析
  • reactive 解构赋值给 ref
  • MVCC详细介绍及面试题
  • 1.Framer Motion 中 motion/react 和 motion/react-client 的用法和区别
  • A009-基于pytest的网易云自动化测试
  • react-07React提交表单数据调用同一方法(高阶函数,函数柯里化概念)
  • 浅析基于单片机的数字时钟与温度显示系统的设计
  • 50kN载重汽车轮胎高速耐久试验机
  • 【Linux】基础 IO(文件描述符、重定向、缓冲区)
  • Rust泛型与特性
  • 【数据结构】之散列
  • Xtuner微调大模型
  • 同济大学轻量化低成本具身导航!COSMO:基于选择性记忆组合的低开销视觉语言导航
  • 武汉大学新闻与传播学院已由“80后”副院长吴世文主持工作
  • 奔驰一季度利润降四成,受美国加征关税影响放弃全年盈利展望
  • 中央党校(国家行政学院)举行2025年春季学期第一批进修班毕业典礼
  • 马上评|什么才是地方文旅宣传的正确姿势
  • 中办、国办印发《安全生产考核巡查办法》
  • 新质观察|重塑低空经济的系统安全观