观察者设计模式

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

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

相关推荐
月巴月巴白勺合鸟月半1 小时前
一个C#开发的APP
c#·web
我曾经是个程序员1 小时前
C#File文件基础操作大全
开发语言·c#
三天不学习2 小时前
C# 中的记录类型简介 【代码之美系列】
后端·c#·微软技术·record·记录类型
Artistation Game3 小时前
一、c#基础
游戏·unity·c#·游戏引擎
chen_2273 小时前
kanzi3.6.10 窗口插件-查找绑定信息
c#·kanzi
Murphy20236 小时前
.net4.0 调用API(form-data)上传文件及传参
开发语言·c#·api·httpwebrequest·form-data·uploadfile·multipart/form-
我曾经是个程序员6 小时前
C#Directory类文件夹基本操作大全
服务器·开发语言·c#
鸿喵小仙女7 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
一个不正经的林Sir7 小时前
C#WPF基础介绍/第一个WPF程序
开发语言·c#·wpf
码农君莫笑18 小时前
使用blazor开发信息管理系统的应用场景
数据库·信息可视化·c#·.net·visual studio