理解C#中的观察者模式(Observer Pattern)

265 阅读3分钟

题目:理解C#中的观察者模式(Observer Pattern)

简介

观察者模式是一种行为设计模式,也称为发布-订阅模式(Publish-Subscribe Pattern)。它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在.NET Framework中,实现了一个标准的观察者模式接口——IObservable和IObserver。

概念

C#观察者模式,也被称为发布-订阅模式,是一种软件设计模式。其基本原理是,当被观察者发生改变时,它会主动通知所有关注它的观察者。具体实现时,被观察者类中包含一个容器,当有观察者关注它时,被观察者会将这个观察者添加到这个容器中。当被观察者有事件发生时,它会遍历这个容器,通知所有关注它的观察者。这样,无论何时只要被观察者的状态发生变化,与之相关的所有观察者都能立即获知并做出反应。 在C#中实现观察者模式一般包括三部分:观察者接口、观察目标抽象类和观察目标的具体实现。

主题(Subject): 主题是通知的发送者,它负责维护一个观察者列表,并在状态发生变化时通知所有已注册的观察者。在.NET Framework中,可以通过实现IObservable接口来创建一个主题。

观察者(Observer): 观察者是通知的接收者,它订阅某个主题并在收到通知时执行相应的操作。在.NET Framework中,可以通过实现IObserver接口来创建一个观察者。 订阅(Subscribe):当某个观察者对某个主题感兴趣时,它会调用主题的Subscribe方法进行订阅。这样,当主题的状态发生变化时,该观察者就会收到通知。在.NET Framework中,这个操作可以通过调用IObservable.Subscribe方法来实现。

取消订阅(Unsubscribe): 当某个观察者不再对某个主题感兴趣时,它可以调用主题的Unsubscribe方法来取消订阅。这样,当主题的状态发生变化时,该观察者将不再收到通知。在.NET Framework中,这个操作可以通过调用IDisposable.Dispose方法来实现。

更新(Update): 当主题的状态发生变化时,它会调用OnNext方法来向所有已注册的观察者发送更新通知。这个方法可以在IObserver接口中找到。接收到更新的观察者可以根据自己的需要来处理这些更新信息。

首先,定义观察者接口。观察者接口定义了一个OnNotify方法,这个方法会在观察目标状态发生改变时被调用。例如:

  public interface Observer { void OnNotify(); }  

接着,定义观察目标抽象类。观察目标抽象类包含了观察者列表,以及添加观察者、删除观察者和通知所有观察者的方法。例如:

  public abstract class Subject { // 观察者列表 protected List observers;

// 添加观察者
public abstract void Add(Observer observer);

// 删除观察者
public abstract void Remove(Observer observer);

// 通知所有观察者
public abstract void NotifyAllObservers();

}  

最后,定义观察目标的具体实现。观察目标具体实现继承了观察目标抽象类,并实现了Add、Remove和NotifyAllObservers方法。例如:

  public class ConcreteSubject : Subject { public ConcreteSubject() { observers = new List(); }

public override void Add(Observer observer)
{
    if (!observers.Contains(observer))
        observers.Add(observer);
}

public override void Remove(Observer observer)
{
    if (observers.Contains(observer))
        observers.Remove(observer);
}

public override void NotifyAllObservers()
{
    foreach (var observer in observers)
    {
        observer.OnNotify();
    }
}

}  

通过这样的方式,当观察目标状态发生改变时,它可以通过调用NotifyAllObservers方法通知所有的观察者,从而实现了观察者模式。