首頁 >後端開發 >C++ >C# |理解觀察者模式

C# |理解觀察者模式

王林
王林原創
2024-07-23 20:44:151236瀏覽

C# | Understanding the Observer Pattern

Note
You can check other posts on my personal website: https://hbolajraf.net

觀察者模式是一種行為設計模式,其中一個物件(稱為主體)維護其依賴項(稱為觀察者)的列表,並通常透過呼叫其中一個方法來通知它們任何狀態變更。這種模式促進了物件之間的鬆散耦合,因為觀察者只知道主題而不知道彼此。在 C# 中,這種模式常用於事件驅動程式設計。

執行

讓我們透過一個詳細的 C# 範例來了解觀察者模式。

主題介面

首先,我們為主題定義一個介面。此介面將包含註冊、取消註冊和通知觀察者的方法。

public interface ISubject
{
    void RegisterObserver(IObserver observer);
    void UnregisterObserver(IObserver observer);
    void NotifyObservers();
}

觀察者介面

接下來,我們為觀察者定義一個介面。此介面將包含一個方法,主體需要通知觀察者時將呼叫該方法。

public interface IObserver
{
    void Update();
}

具體主題

現在,讓我們實作一個實作 ISubject 介面的具體主題類別。

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

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

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

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

具體觀察者

接下來,讓我們實作一個具體的觀察者類,該類別實作 IObserver 介面。

public class ConcreteObserver : IObserver
{
    public void Update()
    {
        Console.WriteLine("Observer notified of state change.");
    }
}

用法範例

現在,讓我們看看如何一起使用這些類別。

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

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

        subject.NotifyObservers();

        subject.UnregisterObserver(observer1);

        subject.NotifyObservers();
    }
}

在這個例子中,ConcreteSubject 是主體,ConcreteObserver 是觀察者。當呼叫 NotifyObservers() 時,兩個觀察者都會收到狀態變更的通知。註銷一名觀察員後,僅通知剩餘的觀察員。

接下來做什麼?

觀察者模式是在 C# 中實現物件之間溝通的強大方法。它促進鬆散耦合,並且在事件驅動架構中特別有用。透過理解和實現這種模式,您可以編寫更易於維護和擴展的程式碼。

以上是C# |理解觀察者模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn