C# 观察者模式(Observer Pattern)

请教下,C# 观察者模式(Observer Pattern)
最新回答
楠烟

2026-10-18 16:47:42

观察者模式(Observer Pattern)是一种行为设计模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象状态发生变化时,所有依赖它的观察者都会自动收到通知并进行更新。

以下是C#中观察者模式的实现示例:

// 定义观察者接口public interface IObserver{ void Update(ISubject subject);}// 定义主题接口public interface ISubject{ void Attach(IObserver observer); void Detach(IObserver observer); void Notify();}// 具体主题类public class ConcreteSubject : ISubject{ private List<IObserver> observers = new List<IObserver>(); private int state; public void Attach(IObserver observer) { observers.Add(observer); } public void Detach(IObserver observer) { observers.Remove(observer); } public void Notify() { foreach (var observer in observers) { observer.Update(this); } } public int GetState() { return state; } public void SetState(int state) { this.state = state; Notify(); }}// 具体观察者类public class ConcreteObserver : IObserver{ private string name; public ConcreteObserver(string name) { this.name = name; } public void Update(ISubject subject) { Console.WriteLine($"{name} received the message from {subject.GetType().Name}, the new state is {((ConcreteSubject)subject).GetState()}"); }}class Program{ static void Main(string[] args) { ISubject subject = new ConcreteSubject(); IObserver observer1 = new ConcreteObserver("Observer 1"); IObserver observer2 = new ConcreteObserver("Observer 2"); subject.Attach(observer1); subject.Attach(observer2); ((ConcreteSubject)subject).SetState(1); subject.Detach(observer1); ((ConcreteSubject)subject).SetState(2); Console.ReadLine(); }}代码说明:
  1. IObserver接口:定义了观察者的更新方法Update,当主题状态变化时,观察者通过此方法接收通知。

  2. ISubject接口:定义了主题的三个方法:

    Attach:添加观察者。

    Detach:移除观察者。

    Notify:通知所有观察者。

  3. ConcreteSubject类:具体主题实现,维护一个观察者列表和状态变量。当状态变化时,调用Notify方法通知所有观察者。

  4. ConcreteObserver类:具体观察者实现,在Update方法中处理接收到的通知。

  5. Program类:演示如何使用观察者模式:

    创建主题和观察者。

    将观察者附加到主题。

    改变主题状态,触发通知。

    移除一个观察者,再次改变状态,观察通知情况。

输出结果:Observer 1 received the message from ConcreteSubject, the new state is 1Observer 2 received the message from ConcreteSubject, the new state is 1Observer 2 received the message from ConcreteSubject, the new state is 2观察者模式的核心思想:
  • 主题(Subject):维护观察者列表,提供添加、删除和通知观察者的方法。
  • 观察者(Observer):定义更新接口,接收主题的通知。
  • 松耦合:主题和观察者之间是松耦合关系,主题不需要知道观察者的具体实现。
  • 动态订阅:观察者可以动态地订阅或取消订阅主题的通知。

这种模式常用于事件处理系统、发布-订阅系统等场景,能够实现对象间的松耦合通信。