使用 C# 事件與委派實作經典觀察者模式:
public class NumberEventArgs : EventArgs {
public NumberEventArgs(int number) { _number = number; }
private int _number;
public int Number { get { return _number; } set { _number = value; } }
}
public delegate void NumberEventHandler(object sender, NumberEventArgs e);
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 條件運算子
}
}
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 檢查