表單欄位與初始化
private readonly ProcessNumber _pn = new ProcessNumber(100);
private ShowNumberDel _del;
private void Form1_Load(object sender, EventArgs e)
{
// _pn 已在欄位初始化器建立
}
三種輸出實作方法
// 1. Console
private void ShowInConsole(object[] items)
{
foreach (var item in items) Console.WriteLine(item);
}
// 2. ListBox
private void ShowInListBox(object[] items)
{
listBox1.Items.Clear();
foreach (var item in items) listBox1.Items.Add(item);
}
// 3. Text File
private void ShowInFile(object[] items)
{
using var sw = new StreamWriter("Test.txt", true);
foreach (var item in items) sw.WriteLine(item);
}
按鈕事件綁定
// 單一策略
private void button1_Click(object sender, EventArgs e) =>
_pn.ProcessItems(new ShowNumberDel(ShowInConsole));
private void button2_Click(object sender, EventArgs e) =>
_pn.ProcessItems(new ShowNumberDel(ShowInListBox));
private void button3_Click(object sender, EventArgs e) =>
_pn.ProcessItems(new ShowNumberDel(ShowInFile));
// 組合策略:多播委派
private void button4_Click(object sender, EventArgs e)
{
_del = null; // 重置
_del += new ShowNumberDel(ShowInListBox);
_del += new ShowNumberDel(ShowInFile);
_pn.ProcessItems(_del);
}
設計重點
- 關注點分離:處理邏輯 (`ProcessNumber`) 不知輸出細節
- 執行時期組合:按鈕決定輸出組合,無需修改處理類別
- 開放封閉:新增輸出目標(如 Database、Network)只需新增方法並綁定