观察者设计模式

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

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

相关推荐
__water2 小时前
『功能项目』回调函数处理死亡【54】
c#·回调函数·unity引擎
__water2 小时前
『功能项目』眩晕图标显示【52】
c#·unity引擎·动画事件
__water3 小时前
『功能项目』第二职业法师的平A【57】
c#·unity引擎·魔法球伤害传递
__water5 小时前
『功能项目』战士的伤害型技能【45】
c#·unity引擎·战士职业伤害型技能
君莫愁。6 小时前
【Unity】检测鼠标点击位置是否有2D对象
unity·c#·游戏引擎
Lingbug7 小时前
.Net日志组件之NLog的使用和配置
后端·c#·.net·.netcore
咩咩觉主7 小时前
Unity实战案例全解析:PVZ 植物卡片状态分析
unity·c#·游戏引擎
Echo_Lee07 小时前
C#与Python脚本使用共享内存通信
开发语言·python·c#
__water14 小时前
『功能项目』QFrameWork框架重构OnGUI【63】
c#·unity引擎·重构背包框架
Crazy Struggle14 小时前
C# + WPF 音频播放器 界面优雅,体验良好
c#·wpf·音频播放器·本地播放器