首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式:觀察者模式完整指南(三)— Delegate/Event 機制簡化實作詳解

     編輯:關於C語言

C# 內建 Delegate 與 Event 機制

.NET 提供原生支援,可大幅簡化觀察者模式實作,無需手動維護觀察者清單。

完整結構性代碼


using System;

// 1. 定義委派:規範通知方法簽章
delegate void UpdateDelegate();

// 2. 主題角色
class Subject
{
    public event UpdateDelegate UpdateHandler;

    public void Attach(UpdateDelegate ud) => UpdateHandler += ud;
    public void Detach(UpdateDelegate ud) => UpdateHandler -= ud;

    public void Notify()
    {
        if (UpdateHandler != null) UpdateHandler();
    }
}

// 3. 具體主題
class ConcreteSubject : Subject
{
    private string subjectState;
    public string SubjectState
    {
        get => subjectState;
        set => subjectState = value;
    }
}

// 4. 具體觀察者 A
class ConcreteObserver
{
    private string name;
    private string observerState;
    private ConcreteSubject subject;

    public ConcreteObserver(ConcreteSubject subject, string name)
    {
        this.subject = subject;
        this.name = name;
    }

    public void Update()
    {
        observerState = subject.SubjectState;
        Console.WriteLine($"Observer {name}'s new state is {observerState}");
    }
}

// 5. 另一種觀察者:方法名不同也可訂閱
class AnotherObserver
{
    public void Show() => Console.WriteLine("AnotherObserver got an Notification!");
}

// 6. 客戶端測試
public class Client
{
    public static void Main()
    {
        ConcreteSubject s = new ConcreteSubject();
        ConcreteObserver o1 = new ConcreteObserver(s, "1");
        ConcreteObserver o2 = new ConcreteObserver(s, "2");
        AnotherObserver o3 = new AnotherObserver();

        s.Attach(new UpdateDelegate(o1.Update));
        s.Attach(new UpdateDelegate(o2.Update));
        s.Attach(new UpdateDelegate(o3.Show));  // 關鍵:Show() 也能訂閱!

        s.SubjectState = "ABC";
        s.Notify();

        Console.WriteLine("--------------------------");

        s.Detach(new UpdateDelegate(o1.Update)); // 移除 o1
        s.SubjectState = "DEF";
        s.Notify();
    }
}

執行結果

Observer 1's new state is ABC
Observer 2's new state is ABC
AnotherObserver got an Notification!
--------------------------
Observer 2's new state is DEF
AnotherObserver got an Notification!

核心優勢總結

  • 方法名自由:不強制命名為 Update(),任何符合委派簽章的方法皆可
  • 自動管理清單:+=/-= 自動處理訂閱/取消訂閱
  • 型別安全:委派保證方法簽章一致性
  • 多播支援:一個事件自動調用所有訂閱方法
  • 語言原生:無需手寫觀察者介面與清單管理代碼

適用場景建議

  • 簡單通知場景:優先使用 event/delegate
  • 需強制契約、跨組件/跨語言互操作:使用介面式觀察者
  • 複雜狀態同步、需攜帶豐富變更上下文:考慮 EventArgs 衍生類別
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved