C# 观察者模式实例介绍


在C#中,观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

下面是一个简单的C#观察者模式实例,其中包括了主题(Subject)接口、具体主题(ConcreteSubject)类、观察者(Observer)接口和具体观察者(ConcreteObserver)类。

### 1. 定义观察者接口


public interface IObserver
{
    void Update(string message);
}

### 2. 定义具体观察者类


public class ConcreteObserver : IObserver
{
    private string name;

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

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

### 3. 定义主题接口


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

### 4. 定义具体主题类


using System.Collections.Generic;

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

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

    public void RemoveObserver(IObserver o)
    {
        observers.Remove(o);
    }

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

    // 这里可以添加用于修改状态的方法,当状态改变时调用NotifyObservers
}

### 5. 使用示例


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

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

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

        subject.NotifyObservers("Hello, Observers!");

        // 如果你想取消注册某个观察者,可以调用RemoveObserver
        // subject.RemoveObserver(observer1);
    }
}

这个例子中,`ConcreteSubject` 类是主题,维护了一个观察者列表,并在状态变化时通过 `NotifyObservers` 方法通知所有注册的观察者。`ConcreteObserver` 类是具体观察者,实现了 `IObserver` 接口,并在接收到更新时打印一条消息。`Main` 方法中演示了如何注册观察者、通知观察者和(可选的)取消注册观察者。