观察者模式

观察者模式定义

观察者模式(Observer Pattern)是一种行为设计模式,其主要目标是定义对象之间的一对多的依赖关系,以便当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动更新。

观察者模式的思想

  1. 主题和观察者的分离: 观察者模式通过将主题和观察者分离,实现了低耦合的设计。主题对象负责维护状态,并通知观察者,而观察者则独立于主题而存在,只需关注状态的变化。

  2. 一对多的依赖关系: 主题对象可以有多个观察者,形成一对多的依赖关系。这意味着一个状态变化会触发多个观察者的更新操作。

  3. 动态注册和移除观察者: 观察者模式支持动态地注册和移除观察者,使得系统更具有灵活性。新的观察者可以在运行时被添加,而不需要修改主题对象的代码。

  4. 松散耦合: 观察者模式实现了松散耦合的设计,使得主题对象和观察者对象可以独立变化。主题对象无需知道具体观察者的细节,而观察者也不需要直接与主题对象紧密耦合。

观察者模式包括角色

  1. 主题(Subject): 维护一个观察者列表,提供方法用于注册、移除和通知观察者。主题的状态发生变化时,会通知所有注册的观察者。

  2. 观察者(Observer): 定义一个更新接口,用于接收主题通知。具体的观察者实现这个接口,并在主题状态发生变化时更新自身状态。

  3. 具体主题(ConcreteSubject): 实现主题接口,负责维护观察者列表,并在状态变化时通知观察者。

  4. 具体观察者(ConcreteObserver): 实现观察者接口,具体的观察者在接收到通知时执行相应的更新操作。

观察者模式简单实现

主题接口 (ISubject)

cs 复制代码
public interface ISubject
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

观察者接口 (IObserver)

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

具体主题类 (ConcreteSubject)

cs 复制代码
public class ConcreteSubject : ISubject
{
    private List<IObserver> observers = new List<IObserver>();
    private string state;
​
    public string State
    {
        get { return state; }
        set
        {
            state = value;
            NotifyObservers();
        }
    }
​
    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(state);
        }
    }
}

具体观察者类 (ConcreteObserver)

cs 复制代码
public class ConcreteObserver : IObserver
{
    private string name;
    public ConcreteObserver(string name)
    {
        this.name = name;
    }
​
    public void Update(string message)
    {
        Console.WriteLine($"{name} 收到消息:{message}");
    }
}

测试

cs 复制代码
class Program
{
    static void Main()
    {
        // 创建具体主题对象
        ConcreteSubject subject = new ConcreteSubject();
        // 创建具体观察者对象
        ConcreteObserver observer1 = new ConcreteObserver("观察者1");
        ConcreteObserver observer2 = new ConcreteObserver("观察者2");
​
        // 注册观察者
        subject.RegisterObserver(observer1);
        subject.RegisterObserver(observer2);
​
        // 主题状态改变,通知观察者
        subject.State = "新消息1";
​
        // 移除一个观察者
        subject.RemoveObserver(observer1);
​
        // 主题状态再次改变,通知观察者
        subject.State = "新消息2";
    }
}

观察者模式的优点

松散耦合: 主题和观察者相互之间松散耦合,使得它们可以独立变化而不会影响彼此。

可扩展性: 可以轻松地添加新的观察者或主题,扩展系统的功能。

灵活性: 允许对象在运行时建立一对多的依赖关系,提供了更灵活的通信机制。

注意事项

异常处理: 在观察者的 Update 方法中添加适当的异常处理,以确保一个观察者的异常不会中断整个通知过程。

异步通知: 如果观察者的更新操作可能是耗时的,可以考虑使用异步通知,以提高整体性能。

多种实现:例如在C#中也可以使用委托和事件来实现

相关推荐
我希望的一路生花5 小时前
Nik Collection 6.2全新版Nik降噪锐化调色PS/LR插件
人工智能·计算机视觉·设计模式·stable diffusion·aigc
谷宇.9 小时前
【Unity3D实例-功能-拔枪】角色拔枪(三)IK的使用-紧握武器
游戏·unity·c#·unity3d·游戏开发·游戏编程·steam
用户83562907805110 小时前
C# 从 PDF 提取图片教程
后端·c#
东北南西11 小时前
设计模式-工厂模式
前端·设计模式
JohnYan11 小时前
工作笔记 - 改进的单例应用
javascript·设计模式·bun
格林威12 小时前
Baumer高防护相机如何通过YoloV8深度学习模型实现网球运动员和网球速度的检测分析(C#代码UI界面版)
人工智能·深度学习·数码相机·yolo·ui·c#·视觉检测
hixiong12313 小时前
用OpencvSharp编写视频录制工具
opencv·c#·音视频
张飞洪13 小时前
C# 13 与 .NET 9 跨平台开发实战:基于.NET 9 与 EF Core 9 的现代网站与服务开发
开发语言·c#·.net
郝学胜-神的一滴13 小时前
使用C++11改进工厂方法模式:支持运行时配置的增强实现
开发语言·c++·程序人生·设计模式