首页  >  文章  >  后端开发  >  C# |理解观察者模式

C# |理解观察者模式

王林
王林原创
2024-07-23 20:44:151190浏览

C# | Understanding the Observer Pattern

Note
You can check other posts on my personal website: https://hbolajraf.net

观察者模式是一种行为设计模式,其中一个对象(称为主体)维护其依赖项(称为观察者)的列表,并通常通过调用其中一个方法来通知它们任何状态更改。这种模式促进了对象之间的松散耦合,因为观察者只知道主题而不知道彼此。在 C# 中,这种模式常用于事件驱动编程。

执行

让我们通过一个详细的 C# 示例来了解观察者模式。

主题界面

首先,我们为主题定义一个接口。该接口将包含注册、取消注册和通知观察者的方法。

public interface ISubject
{
    void RegisterObserver(IObserver observer);
    void UnregisterObserver(IObserver observer);
    void NotifyObservers();
}

观察者界面

接下来,我们为观察者定义一个接口。该接口将包含一个方法,主体需要通知观察者时将调用该方法。

public interface IObserver
{
    void Update();
}

具体主题

现在,让我们实现一个实现 ISubject 接口的具体主题类。

public class ConcreteSubject : ISubject
{
    private List<IObserver> observers = new List<IObserver>();

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

    public void UnregisterObserver(IObserver observer)
    {
        observers.Remove(observer);
    }

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

具体观察者

接下来,让我们实现一个具体的观察者类,该类实现 IObserver 接口。

public class ConcreteObserver : IObserver
{
    public void Update()
    {
        Console.WriteLine("Observer notified of state change.");
    }
}

用法示例

现在,让我们看看如何一起使用这些类。

class Program
{
    static void Main(string[] args)
    {
        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver observer1 = new ConcreteObserver();
        ConcreteObserver observer2 = new ConcreteObserver();

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

        subject.NotifyObservers();

        subject.UnregisterObserver(observer1);

        subject.NotifyObservers();
    }
}

在这个例子中,ConcreteSubject 是主体,ConcreteObserver 是观察者。当调用 NotifyObservers() 时,两个观察者都会收到状态更改的通知。注销一名观察员后,仅通知剩余的观察员。

接下来做什么?

观察者模式是在 C# 中实现对象之间通信的强大方法。它促进松散耦合,并且在事件驱动架构中特别有用。通过理解和实现这种模式,您可以编写更易于维护和扩展的代码。

以上是C# |理解观察者模式的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn