观察者设计模式

观察者设计模式(Observer Design Pattern),又称为发布-订阅模式(Publish-Subscribe Pattern),是一种软件设计模式,使得多个对象(称为"观察者"或"订阅者")可以监听另一个对象(称为"主题"或"发布者")的状态变化。当主题对象的状态发生变化时,所有注册为观察者的对象都会得到通知并自动更新。

观察者模式的核心组件包括:

  1. 主题(Subject)

    • 主题是被观察的对象,它维护了一系列观察者对象的引用,并提供接口供观察者注册(订阅)或注销(取消订阅)。
  2. 观察者(Observer)

    • 观察者是监听主题的对象,它们实现了一个统一的接口,以便在主题状态更新时接收通知。
  3. 具体主题(Concrete Subject)

    • 具体主题是主题的具体实现,它包含当前状态和所有观察者的引用,并负责在状态改变时通知观察者。
  4. 具体观察者(Concrete Observer)

    • 具体观察者是观察者的具体实现,它们在接收到主题的通知时更新自己的状态。

观察者模式的主要优点包括:

  • 解耦:主题和观察者之间的耦合度降低,因为主题通常不知道观察者的具体身份。

  • 可扩展性:可以很容易地添加更多的观察者,而不需要修改主题的代码。

  • 动态性观察者可以动态地订阅或取消订阅主题的通知。

观察者模式是行为设计模式之一,它定义了对象间的一种一对多的依赖关系,让一个对象的改变能够触发其他对象的改变。以下是使用C#实现观察者模式的一个实际例子:

假设我们有一个新闻发布系统,当发布新闻时,所有订阅者(观察者)都应该收到新闻通知。

定义观察者接口

cs 复制代码
public interface IObserver
{
    void Update(string news);
}

定义主题接口

cs 复制代码
public interface ISubject
{
    void Register(IObserver observer);
    void Unregister(IObserver observer);
    void Notify(string news);
}

具体主题

cs 复制代码
public class NewsAgency : ISubject
{
    private List<IObserver> observers = new List<IObserver>();
​
    public void Register(IObserver observer)
    {
        if (!observers.Contains(observer))
        {
            observers.Add(observer);
        }
    }
​
    public void Unregister(IObserver observer)
    {
        observers.Remove(observer);
    }
​
    public void Notify(string news)
    {
        foreach (var observer in observers)
        {
            observer.Update(news);
        }
    }
​
    // 发布新闻的方法
    public void ReleaseNews(string news)
    {
        Console.WriteLine("News has been released: " + news);
        Notify(news);
    }
}

具体观察者

cs 复制代码
public class NewsSubscriber : IObserver
{
    public void Update(string news)
    {
        Console.WriteLine("NewsSubscriber received news: " + news);
    }
}

客户端代码

cs 复制代码
class Program
{
    static void Main(string[] args)
    {
        // 创建新闻发布机构
        NewsAgency newsAgency = new NewsAgency();
​
        // 创建订阅者
        IObserver subscriber1 = new NewsSubscriber();
        IObserver subscriber2 = new NewsSubscriber();
​
        // 订阅新闻
        newsAgency.Register(subscriber1);
        newsAgency.Register(subscriber2);
​
        // 发布新闻
        newsAgency.ReleaseNews("New C# Features in 2024");
​
        // 取消订阅
        newsAgency.Unregister(subscriber1);
​
        // 再次发布新闻,subscriber1 将不会收到通知
        newsAgency.ReleaseNews("New Update on .NET 7 Performance");
    }
}

在这个例子中,NewsAgency 是具体主题,它维护了一系列订阅者(观察者),并在发布新闻时通知他们。NewsSubscriber 是具体观察者,实现了 IObserver 接口,当接收到新闻时输出新闻内容。

客户端代码演示了如何创建主题和观察者,注册观察者,发布新闻,并取消订阅。当 NewsAgency 发布新闻时,所有注册的观察者都会收到通知并更新自己的状态(在这个例子中是输出新闻内容)。

观察者模式非常适合于实现消息发布和订阅系统、事件处理系统等场景,它有助于降低系统各部分之间的耦合度,提高代码的可维护性和可扩展性。

相关推荐
Dm_dotnet几秒前
WPF应用绑定系统快捷键
c#
.NET修仙日记几秒前
SQL Server实战指南:从基础CRUD到高并发处理的完整面试题库
面试·职场和发展·c#·.net·sql server·.net全栈经典面试题库
武文斌772 小时前
项目学习总结:CAN总线、摄像头、STM32概述
linux·arm开发·stm32·单片机·嵌入式硬件·学习·c#
sali-tec2 小时前
C# 基于halcon的视觉工作流-章46-不匀面划痕
人工智能·算法·计算机视觉·c#
数字化顾问3 小时前
从 DAG 到 Shuffle:掌握 Spark RDD 宽窄依赖的调优密码
c#·linq
Happy coder5 小时前
【avalonia教程】11字符串格式化、avalonia自带绑定值的转换
c#·avalonia
Panda__Panda12 小时前
docker项目打包演示项目(数字排序服务)
运维·javascript·python·docker·容器·c#
weixin_4569042712 小时前
基于.NET Framework 4.0的串口通信
开发语言·c#·.net
Tiger_shl13 小时前
C# 预处理指令 (# 指令) 详解
开发语言·c#
sali-tec14 小时前
C# 基于halcon的视觉工作流-章45-网格面划痕
开发语言·算法·计算机视觉·c#