」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > C# |理解觀察者模式

C# |理解觀察者模式

發佈於2024-07-30
瀏覽:959

C# | Understanding the Observer Pattern

筆記
您可以查看我個人網站上的其他帖子: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 observers = new List();

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

版本聲明 本文轉載於:https://dev.to/hbolajraf/c-understanding-the-observer-pattern-1nm6如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    如何為JavaScript對像變量創建動態鍵,嘗試為JavaScript對象創建動態鍵,使用此Syntax jsObj['key' i] = 'example' 1;將不起作用。正確的方法採用方括號:他們維持一個長度屬性,該屬性反映了數字屬性(索引)和一個數字屬性的數量。標準對像沒有模仿這...
    程式設計 發佈於2025-02-07
  • 為什麼我會得到\“ attributeError:module \'enum \'沒有屬性\'intflag \'\” python 3.6.1?
    為什麼我會得到\“ attributeError:module \'enum \'沒有屬性\'intflag \'\” python 3.6.1?
    [ attributeError:module'enum'在python 3.6.1 一個可能的原因是Enum34軟件包的存在,該軟件包提供了與Python 3.4和更早版本的兼容性。但是,在Python 3.6及以後的情況下,不再需要Enum34的實現。要驗證ENUM34是否正...
    程式設計 發佈於2025-02-07
  • 如何使用Python的記錄模塊實現自定義處理?
    如何使用Python的記錄模塊實現自定義處理?
    使用Python的Loggging Module 確保正確處理和登錄對於疑慮和維護的穩定性至關重要Python應用程序。儘管手動捕獲和記錄異常是一種可行的方法,但它可能乏味且容易出錯。 解決此問題,Python允許您覆蓋默認的異常處理機制,並將其重定向為登錄模塊。這提供了一種方便而係統的方法來捕獲...
    程式設計 發佈於2025-02-07
  • 操作員?= Java腳本
    操作員?= Java腳本
    JavaScript 的安全賦值運算符 ?=:簡化異步操作中的錯誤處理 JavaScript 引入了一個新的運算符 ?=,稱為安全賦值運算符。它旨在簡化代碼中的錯誤處理,使代碼更易於閱讀和維護,尤其是在處理 try-catch 錯誤捕獲函數時。 ?= 運算符如何工作? 使用 ?= 運算符時,它...
    程式設計 發佈於2025-02-07
  • 在保持其內容完整時,如何刪除DIV元素?
    在保持其內容完整時,如何刪除DIV元素?
    在保留其元素 display:cottents; display:cottents; cottents;在這種情況下是理想的選擇。它導致元素的孩子出現為父母的直接子女,無視元素本身。當使用CSS網格或其他應該忽略包裝元素的佈局技術時,這是有價值的。 。容器{ 顯示:Flex; } 。一 ...
    程式設計 發佈於2025-02-07
  • 在JavaScript中聲明變量時,為什麼要始終使用\“ var \”?
    在JavaScript中聲明變量時,為什麼要始終使用\“ var \”?
    考慮以下示例:您可能希望此功能返回11;但是,由於“ varaible2 = 6”上的錯別字,它返回了NAN。線。更糟糕的是,該錯別字無意間創建一個全局變量,它具有拼寫錯誤的名稱“ varaible2。因此,強烈建議使用“ var”關鍵字,即使對於全局變量,也建議始終使用“ var”關鍵字來聲明變...
    程式設計 發佈於2025-02-06
  • 如何從大熊貓的大型文本數據集中有效刪除標點符號?
    如何從大熊貓的大型文本數據集中有效刪除標點符號?
    挑戰: 這個問題在處理大型文本數據集時探索了str.replace的幾種性能替代方案: 1。 REGEX.SUB:使用預編譯的Regex模式從RE庫中使用SUB函數。此方法對str.replace進行了重大的性能改進。 2。 str.translate:利用python的str.transl...
    程式設計 發佈於2025-02-06
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。 To resolve this issue and ensure scripts execute on subsequent page visits, Firefox...
    程式設計 發佈於2025-02-06
  • 我如何設計用於存儲全球街道地址的最佳數據庫?
    我如何設計用於存儲全球街道地址的最佳數據庫?
    確定全球街道地址的最佳數據庫設計作為程序員,您會面臨設計數據庫的挑戰來自世界各地。本文探討了實現此目標的可能性,並提供了一種實用方法。 全局地址的常見數據庫結構地址line(x4) 郵政編碼 sub-building house/premise number 簡化數據輸入局部考慮[&&&&&&...
    程式設計 發佈於2025-02-06
  • 我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    我可以將加密從McRypt遷移到OpenSSL,並使用OpenSSL遷移MCRYPT加密數據?
    將我的加密庫從mcrypt升級到openssl 問題:是否可以將我的加密庫從McRypt升級到OpenSSL?如果是這樣?使用openssl? 答案:可以使用mcrypt數據加密數據,可以使用openssl。關於如何使用openssl對McRypt進行加密的數據: openssl_decryp...
    程式設計 發佈於2025-02-06
  • 如何在Java列表中有效計算元素的發生?
    如何在Java列表中有效計算元素的發生?
    計數列表中的元素出現在列表 中,在java編程中,列舉列表中列舉元素出現的任務來自列表。為此,收集框架提供了全面的工具套件。 在這種情況下,Batocurrences變量將保持值3,代表動物列表中的“ BAT”出現的數量。 &&& [此方法是簡單的,可以得出準確的結果,使其成為計算列表中元素出現的...
    程式設計 發佈於2025-02-06
  • 如何有效地更新實體框架5中的記錄?
    如何有效地更新實體框架5中的記錄?
    [2 優化實體框架5記錄更新 實體框架5提供了幾種更新數據庫記錄的方法。 該分析比較了三種常見方法,突出了它們的優勢和缺點,以幫助您選擇滿足需求的最佳方法。 方法1:獲取並更新單個屬性 允許對修改哪些屬性進行精確控制。 屬性排除:對於某些屬性(如密碼)不應通過此方法直接更新的方案。 多個查詢:...
    程式設計 發佈於2025-02-06
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在java中的多個返回類型:一個誤解介紹,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但是,情況確實如此嗎? 通用方法:拆開神秘 [方法僅具有單一的返回類型。相反,它採用機制,如鑽石符號“ ”。 分解方法簽名: :本節定義了一個通用類型參數,E。它表示該方法接受了擴展foo類...
    程式設計 發佈於2025-02-06
  • 我可以在CSS中使用SVG作為偽元素嗎?
    我可以在CSS中使用SVG作為偽元素嗎?
    使用svgs用作pseudo-element content css content properts允許在使用元素之前或之後使用元素插入各種類型的內容偽元素,例如::之前和::之後。但是,對可以包括哪些內容有限制。 可以將svgs用作pseudo-element Content? ,現在可以使...
    程式設計 發佈於2025-02-06
  • 在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在沒有密碼提示的情況下,如何在Ubuntu上安裝MySQL?
    在ubuntu 使用debconf-set-selections sudo debconf-set-selections
    程式設計 發佈於2025-02-06

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3