觀察者模式

电器小君子發表於2024-09-09

觀察者模式是一種行為設計模式,在該模式中,一個物件(稱為主題)維護一組依賴它的物件(稱為觀察者),當主題狀態發生變化時,它會自動通知並更新所有觀察者。下面是一個簡單的觀察者模式的示例程式碼:

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() 方法改變主題的狀態,從而觸發通知並更新所有觀察者。每個觀察者在接收到通知時會輸出相應的資訊。

這個例子展示了觀察者模式的基本實現,透過這種方式,主題與觀察者之間實現瞭解耦,主題可以獨立改變狀態並通知觀察者,觀察者可以自由地訂閱和取消訂閱主題的通知。

相關文章