Please enable Javascript to view the contents

C# 观察者模式

 ·  ☕ 3 分钟  ·  ✍️ YSL

在C#中,观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象可以同时监听一个主题对象,当主题对象发生变化时,所有观察者对象都会得到通知并进行相应的操作。在C#中,可以使用以下方式实现观察者模式:

  1. 定义主题接口:在C#中,可以定义一个主题接口,该接口包含注册、注销和通知观察者的方法。例如:
1
2
3
4
5
public interface ISubject {
    void RegisterObserver(IObserver observer);
    void RemoveObserver(IObserver observer);
    void NotifyObservers();
}

在以上示例中,我们定义了一个 ISubject 接口,它包含一个 RegisterObserver 方法,用于注册观察者;一个 RemoveObserver 方法,用于注销观察者;以及一个 NotifyObservers 方法,用于通知所有观察者。

  1. 定义观察者接口:在C#中,可以定义一个观察者接口,该接口包含被通知时执行的方法。例如:
1
2
3
public interface IObserver {
    void Update(ISubject subject);
}

在以上示例中,我们定义了一个 IObserver 接口,它包含一个 Update 方法,用于在被通知时执行相应的操作。

  1. 创建具体主题类:在C#中,可以创建一个具体主题类,它实现了 ISubject 接口,并封装了具体的业务逻辑。例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class ConcreteSubject : ISubject {
    private List<IObserver> observers = new List<IObserver>();
    private string state;

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

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

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

    public void SetState(string state) {
        this.state = state;
        NotifyObservers();
    }

    public string GetState() {
        return state;
    }
}

在以上示例中,我们创建了一个 ConcreteSubject 类,它实现了 ISubject 接口,并包含一个 List 类型的 observers 字段,用于存储观察者对象。RegisterObserver、RemoveObserver 和 NotifyObservers 方法分别用于注册观察者、注销观察者和通知观察者。SetState 和 GetState 方法用于设置和获取主题的状态。

  1. 创建具体观察者类:在C#中,可以创建一个或多个具体观察者类,它们实现了 IObserver 接口,并封装了具体的操作。例如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class ConcreteObserver : IObserver {
    private string name;

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

    public void Update(ISubject subject) {
        Console.WriteLine($"{name} received {((ConcreteSubject)subject).GetState()}");
    }
}

在以上示例中,我们创建了一个 ConcreteObserver 类,它实现了 IObserver 接口,并包含一个字符串类型的成员变量 name。在 ConcreteObserver 类的构造函数中,我们传入一个字符串参数 name,并将其赋值给成员变量。Update 方法用于接收主题的通知,并输出相应的信息。

  1. 使用观察者模式:在C#中,可以创建具体主题对象、具体观察者对象,并将观察者对象注册到主题对象中,以实现观察者模式。例如:
1
2
3
4
5
6
7
8
ConcreteSubject subject = new ConcreteSubject();
IObserver observer1 = new ConcreteObserver("Observer1");
IObserver observer2 = new ConcreteObserver("Observer2");

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

subject.SetState("New State"); // 输出 "Observer1 received New State" 和 "Observer2 received New State"

在以上示例中,我们创建了一个 ConcreteSubject 对象 subject、两个 ConcreteObserver 对象 observer1 和 observer2。然后,我们将 observer1 和 observer2 注册到 subject 中,并调用 subject 的 SetState 方法,以改变主题的状态并通知所有观察者。

需要注意的是,在使用观察者模式时,应该避免观察者和主题之间产生循环依赖关系,以免影响程序的性能和可维护性。同时,应该注意观察者的数量和生命周期,以确保程序的稳定性和可靠性。