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(); }}代码说明:IObserver接口:定义了观察者的更新方法Update,当主题状态变化时,观察者通过此方法接收通知。
ISubject接口:定义了主题的三个方法:
Attach:添加观察者。
Detach:移除观察者。
Notify:通知所有观察者。
ConcreteSubject类:具体主题实现,维护一个观察者列表和状态变量。当状态变化时,调用Notify方法通知所有观察者。
ConcreteObserver类:具体观察者实现,在Update方法中处理接收到的通知。
Program类:演示如何使用观察者模式:
创建主题和观察者。
将观察者附加到主题。
改变主题状态,触发通知。
移除一个观察者,再次改变状态,观察通知情况。
这种模式常用于事件处理系统、发布-订阅系统等场景,能够实现对象间的松耦合通信。