观察者设计模式

观察者设计模式(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 发布新闻时,所有注册的观察者都会收到通知并更新自己的状态(在这个例子中是输出新闻内容)。

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

相关推荐
周杰伦fans2 小时前
C#中修饰符
开发语言·c#
avi91113 小时前
[AI相关]Unity的C#代码如何简写
unity·c#·语法糖
CoderIsArt5 小时前
openGL和C#下使用openGL
开发语言·c#
视觉人机器视觉8 小时前
机器视觉中的3D高反光工件检测
人工智能·3d·c#·视觉检测
CodeCraft Studio8 小时前
文档处理控件TX Text Control系列教程:使用 .NET C# 从 PDF 文档中提取基于模板的文本
pdf·c#·.net
一念春风8 小时前
C# 背景 透明 抗锯齿 (效果完美)
开发语言·c#
且听风吟ayan8 小时前
leetcode day19 844+977
leetcode·c#
C137的本贾尼8 小时前
解决 LeetCode 串联所有单词的子串问题
算法·leetcode·c#
CoderIsArt11 小时前
C# 中的一个特性(Attribute)[ThreadStatic]
c#
心疼你的一切11 小时前
C# 中关于补位的写法 PadLeft,PadRight 函数
开发语言·unity·c#·游戏引擎·csdn·心疼你的一切