觀察者模式是一種行為設計模式,在該模式中,一個物件(稱為主題)維護一組依賴它的物件(稱為觀察者),當主題狀態發生變化時,它會自動通知並更新所有觀察者。下面是一個簡單的觀察者模式的示例程式碼:
using System; using System.Collections.Generic; // 主題介面 interface ISubject { void RegisterObserver(IObserver observer); void RemoveObserver(IObserver observer); void NotifyObservers(); } // 觀察者介面 interface IObserver { void Update(string message); } // 具體主題類 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(state); } } // 當狀態發生改變時觸發通知 public void SetState(string newState) { state = newState; NotifyObservers(); } } // 具體觀察者類 class ConcreteObserver : IObserver { private string observerName; public ConcreteObserver(string name) { observerName = name; } public void Update(string message) { Console.WriteLine($"Observer {observerName} received message: {message}"); } } class Program { static void Main() { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver("1"); ConcreteObserver observer2 = new ConcreteObserver("2"); ConcreteObserver observer3 = new ConcreteObserver("3"); subject.RegisterObserver(observer1); subject.RegisterObserver(observer2); subject.RegisterObserver(observer3); subject.SetState("New State"); } }
在上面的程式碼中,我們定義了一個主題介面 ISubject
和一個觀察者介面 IObserver
,並實現了具體的主題類 ConcreteSubject
和具體的觀察者類 ConcreteObserver
。主題類維護觀察者列表,可以註冊、移除觀察者,並在狀態發生變化時通知所有觀察者。觀察者類實現觀察者介面,在接收到主題的通知時進行相應的更新操作。
在 Main()
方法中,我們例項化主題物件和三個觀察者物件,將觀察者註冊到主題中,並透過 SetState()
方法改變主題的狀態,從而觸發通知並更新所有觀察者。每個觀察者在接收到通知時會輸出相應的資訊。
這個例子展示了觀察者模式的基本實現,透過這種方式,主題與觀察者之間實現瞭解耦,主題可以獨立改變狀態並通知觀察者,觀察者可以自由地訂閱和取消訂閱主題的通知。