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

C#设计模式(行为型模式):观察者模式

C#设计模式:观察者模式,让对象间通信更优雅

在软件开发中,我们经常会遇到一个对象的状态发生改变,其他对象需要自动更新或做出相应反应的场景。例如:

  • GUI事件处理: 当用户点击按钮时,按钮需要通知所有注册的事件处理程序。
  • 股票价格更新: 当股票价格发生变化时,所有关注该股票的投资者都需要收到通知。
  • 气象站数据更新: 当气象站收集到新的气象数据时,所有显示气象数据的设备都需要更新显示。

为了实现这种对象间的通信,我们可以使用观察者模式(Observer Pattern),它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生改变时,所有依赖于它的观察者对象都会收到通知并自动更新。

一、观察者模式简介

观察者模式属于行为型设计模式,它主要解决的是对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并自动更新。

二、观察者模式的结构

观察者模式包含四个角色:

  1. Subject(主题): 被观察的对象,它维护一个观察者列表,并提供注册、删除和通知观察者的方法。
  2. Observer(观察者): 定义了一个更新接口,用于接收主题的通知。
  3. ConcreteSubject(具体主题): 具体被观察的对象,它维护自身状态,并在状态改变时通知所有观察者。
  4. ConcreteObserver(具体观察者): 具体的观察者对象,它实现更新接口,并在收到通知时更新自身状态。

三、C# 实现示例

让我们通过一个简单的气象站示例来理解观察者模式:

// 主题接口
interface ISubject
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

// 观察者接口
interface IObserver
{
    void Update(float temperature, float humidity, float pressure);
}

// 具体主题:气象站
class WeatherStation : ISubject
{
    private List<IObserver> _observers = new List<IObserver>();
    private float _temperature;
    private float _humidity;
    private float _pressure;

    public void RegisterObserver(IObserver observer)
    {
        _observers.Add(observer);
    }

    public void RemoveObserver(IObserver observer)
    {
        _observers.Remove(observer);
    }

    public void NotifyObservers()
    {
        foreach (var observer in _observers)
        {
            observer.Update(_temperature, _humidity, _pressure);
        }
    }

    public void SetMeasurements(float temperature, float humidity, float pressure)
    {
        _temperature = temperature;
        _humidity = humidity;
        _pressure = pressure;
        NotifyObservers();
    }
}

// 具体观察者:显示当前天气状况
class CurrentConditionsDisplay : IObserver
{
    private float _temperature;
    private float _humidity;

    public void Update(float temperature, float humidity, float pressure)
    {
        _temperature = temperature;
        _humidity = humidity;
        Display();
    }

    public void Display()
    {
        Console.WriteLine($"Current conditions: {_temperature}F degrees and {_humidity}% humidity");
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        WeatherStation weatherStation = new WeatherStation();

        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay();
        weatherStation.RegisterObserver(currentDisplay);

        weatherStation.SetMeasurements(80, 65, 30.4f);
        weatherStation.SetMeasurements(82, 70, 29.2f);
        weatherStation.SetMeasurements(78, 90, 29.2f);
    }
}

四、观察者模式的优缺点

优点:

  • 松耦合: 主题和观察者之间是松耦合的,主题不需要知道观察者的具体类,只需要知道观察者实现了更新接口。
  • 可扩展性: 可以方便地增加新的观察者,而不需要修改主题的代码。
  • 支持广播通信: 主题可以一次通知所有观察者。

缺点:

  • 可能导致性能问题: 如果观察者数量很多,通知所有观察者可能会比较耗时。
  • 可能导致内存泄漏: 如果观察者没有正确地从主题中注销,可能会导致内存泄漏。

五、总结

观察者模式提供了一种优雅的方式来实现对象间的一对多依赖关系,它在需要实现事件处理、数据更新等场景时非常有用。但是,在使用观察者模式时,也需要考虑其潜在的性能问题和内存泄漏问题。


希望这篇博客能帮助你更好地理解和使用观察者模式!


http://www.kler.cn/a/472241.html

相关文章:

  • 用Python实现简单的任务自动化
  • 【和春笋一起学C++】文本输入与读取(二)
  • Linux 正则表达式 ⑪
  • xss-labs关卡记录15-20关
  • 游戏引擎学习第77天
  • 利用 NineData 实现 PostgreSQL 到 Kafka 的高效数据同步
  • 国产编辑器EverEdit - 如何对汉字按笔划数排序?
  • 态势感知是自动化,势态知感是智能化
  • Excel表头/字段一致的表格拼接【python语言】
  • 【UE5 C++课程系列笔记】22——多线程基础——FRunnable和FRunnableThread
  • fmql裸跑编译过程记录
  • Allure 集成 pytest
  • 学习echarts折线图tooltip属性中formatter文字设置不同颜色的方法
  • 新型企业电站 源网荷储充一体化管理系统 EMS3.0具备哪些功能?
  • 太速科技-754-基于Agilex™ 7 FPGA F 系列的PCIe4.0X16 加速卡
  • 全新免押租赁系统打造便捷安全的租赁体验
  • Web3 游戏 2024:牛市下的缺席者?
  • 利用Spark实现WordCount(Scala语言)
  • 【C】文件操作
  • CUDA编程【7】 线程束
  • 青少年编程与数学 02-006 前端开发框架VUE 10课题、侦听器
  • STM32-笔记35-DMA(直接存储器访问)
  • Approaching a Chatbot Service - Part 3: Bot Model
  • flask后端开发(13):登录功能后端实现和钩子函数
  • 扩散模型论文概述(三):Stability AI系列工作【学习笔记】
  • 基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS