C#实现观察者模式

  观察者模式是一种软件设计模式,当一个对象的状态发生变化时,其所有依赖者都会自动得到通知。

  观察者模式也被称为"发布-订阅"模式,它定义了对象之间的一对多的依赖性,当一个对象状态改变时,所有依赖于它的对象都会得到通知并进行更新。观察者模式通常用于实现事件机制:一个对象触发自己的一个事件,也就是改变自己的状态,然后通知其他的一切依赖于它的对象。

  在观察者模式中,主要有两种角色:

  1. 主题(Subject):它是被观察的对象。当主题的状态发生改变时,会通知所有已注册的观察者。
  2. 观察者(Observer):它是依赖于主题的对象,当接到主题的通知时,会更新自己的状态。

  观察者模式的主要优点是它支持动态的关联,一个系统对象的行为依赖于另一个系统对象的状态。并且它是一种松耦合的设计模式,一个主题不必知道其任何观察者,例如观察者的具体类。

  观察者模式广泛应用于各种编程语言的库和框架中,例如在.NET中,它被用于实现事件模型。

  然而,观察者模式也有一些缺点。例如,如果一个主题有大量的直接和间接的观察者,将会花费大量的时间来通知所有的观察者。另外,如果观察者和主题之间存在循环依赖,可能会导致系统行为的不确定性。

  以下是一个基本的观察者模式的实现:

  首先,我们定义一个IObserver接口和一个ISubject接口:

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

public interface ISubject
{
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers(string message);
}

然后,我们实现一个具体的主题Subject:

csharp 复制代码
public class Subject : ISubject
{
    private List<IObserver> observers = new List<IObserver>();

    public void RegisterObserver(IObserver observer)
    {
        observers.Add(observer);
    }

    public void RemoveObserver(IObserver observer)
    {
        if (observers.Contains(observer))
        {
            observers.Remove(observer);
        }
    }

    public void NotifyObservers(string message)
    {
        foreach (var observer in observers)
        {
            observer.Update(message);
        }
    }
}

接下来,我们实现一个具体的观察者Observer:

csharp 复制代码
public class Observer : IObserver
{
    private string name;

    public Observer(string name)
    {
        this.name = name;
    }

    public void Update(string message)
    {
        Console.WriteLine($"{name} received: {message}");
    }
}

最后,我们可以创建一个主题和多个观察者,并将观察者注册到主题上:

csharp 复制代码
namespace ObserverMode
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("测试C#单例模式");

            ISubject subject = new Subject();

            IObserver observer1 = new Observer("Observer1");
            IObserver observer2 = new Observer("Observer2");

            subject.RegisterObserver(observer1);
            subject.RegisterObserver(observer2);

            subject.NotifyObservers("Hello, observers!");
        }
    }
}

运行结果

  在这个例子中,当我们调用NotifyObservers方法时,注册到subject的所有观察者都会得到通知,并调用它们的Update方法。

相关推荐
椒颜皮皮虾྅2 小时前
让文档不止于文字:DeploySharp + PP-Structure,打通版面分析与表格重建
开发语言·学习·c#·.net·cuda
她说..4 小时前
常见设计模式-观察者模式
java·spring boot·spring·观察者模式·设计模式
椒颜皮皮虾྅4 小时前
一套 C# 接口,解锁四类视觉任务:DeploySharp 分类、分割、关键点与旋转框实战
开发语言·分类·c#
罗迪尼亚的熔岩5 小时前
联合kuka机器人, 海康visonmaster 的手眼9点标定方法
机器人·c#·工业相机·标定
她说彩礼65万5 小时前
C# TaskCompletionSource
java·开发语言·c#
泛凡(Linyongui)21 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
暴走约伯1 天前
【VFX工具链源码拆解 02】告别机械劳动(上):一键统改百个子粒子颜色与批量重命名
3d·unity·c#·材质
信息安全失业大专人员1 天前
每日了解一个智能体-WorkBuddy
开发语言·ai·c#·智能体
呆呆敲代码的小Y1 天前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
淡海水1 天前
09-01-内存-Unity资源生命周期全景
unity·c#·游戏引擎·.netcore·gc