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

C# 實作觀察者模式

     編輯:關於C語言

觀察者模式核心元件

使用 C# 事件與委派實作經典觀察者模式:

1. 事件引數類別

public class NumberEventArgs : EventArgs {
    public NumberEventArgs(int number) { _number = number; }
    private int _number;
    public int Number { get { return _number; } set { _number = value; } }
}

2. 委派定義

public delegate void NumberEventHandler(object sender, NumberEventArgs e);

3. 主題類別

public class Subject {
    public event NumberEventHandler NumberReached;

    public void DoWithLoop(int number) {
        for (int i = 0; i <= 100; i++) {
            if (i == number) {
                OnNumberReached(new NumberEventArgs(i));
            }
        }
    }

    protected virtual void OnNumberReached(NumberEventArgs e) {
        NumberReached?.Invoke(this, e); // C# 6.0 null 條件運算子
    }
}

4. 觀察者與主程式

public class MainProgram {
    public static void Main() {
        Console.WriteLine("請輸入 0-100 的數字:");
        int input = int.Parse(Console.ReadLine());
        if (input < 0 || input > 100) { Console.WriteLine("錯誤"); return; }

        Subject s = new Subject();
        // 訂閱靜態方法
        s.NumberReached += MsgBox_NumberReached;
        // 訂閱實例方法
        MainProgram mp = new MainProgram();
        s.NumberReached += mp.Console_NumberReached;

        s.DoWithLoop(input);
        Console.ReadLine();
    }

    void Console_NumberReached(object sender, NumberEventArgs e) {
        Console.WriteLine($"主控台通知:{e.Number}");
    }

    static void MsgBox_NumberReached(object sender, NumberEventArgs e) {
        MessageBox.Show($"訊息盒通知:{e.Number}");
    }
}

關鍵點

  • 事件封裝委派,提供發布/訂閱機制
  • protected virtual 允許衍生類別覆寫觸發邏輯
  • 使用 ?.Invoke 簡化 null 檢查
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved