策略模式(Strategy Pattern)是行為型設計模式的經典入門,核心在於「將變化的演算法封裝成可互換的策略類,讓客戶端動態切換行為」。《Head First 設計模式》以鴨子模擬器為例,生動展示了「組合優於繼承」、「針對介面程式設計」兩大原則。
基底 Duck 類別有四種行為:
display():外觀顯示,各子類別不同 → 抽象方法swim():游泳,所有鴨子相同 → 基底類別實作fly():飛行,橡皮鴨不會飛 → 提取為介面quack():叫聲,橡皮鴨吱吱叫、木頭鴨不叫 → 提取為介面public interface FlyBehavior { string Fly(); }
public class FlyWithWings : FlyBehavior {
public string Fly() => "正在用翅膀飛行";
}
public class FlyNoWay : FlyBehavior {
public string Fly() => "不會飛";
}
public interface QuackBehavior { string Quack(); }
public class Quack : QuackBehavior {
public string Quack() => "嘎嘎叫";
}
public class Squeak : QuackBehavior {
public string Quack() => "吱吱叫";
}
public class MuteQuack : QuackBehavior {
public string Quack() => "不會叫";
}
public abstract class Duck {
protected FlyBehavior flyBehavior;
protected QuackBehavior quackBehavior;
public Duck() {
flyBehavior = new FlyWithWings(); // 預設行為
quackBehavior = new Quack();
}
public string Swim() => "正在游泳";
public string PerformFly() => flyBehavior.Fly();
public string PerformQuack() => quackBehavior.Quack();
public void SetFlyBehavior(FlyBehavior fb) => flyBehavior = fb;
public void SetQuackBehavior(QuackBehavior qb) => quackBehavior = qb;
public abstract string Display(); // 子類別必須實作
}
public class MallardDuck : Duck {
public override string Display() => "綠頭鴨";
}
public class RedHeadDuck : Duck {
public override string Display() => "紅頭鴨";
}
public class RubberDuck : Duck {
public override string Display() => "橡皮鴨";
}
private void PrintMsg(Duck duck) {
txtMsg.AppendText(duck.Display());
txtMsg.AppendText(duck.PerformFly());
txtMsg.AppendText(duck.PerformQuack());
}
private void BtnStrategy_Click(object sender, EventArgs e) {
txtMsg.Clear();
// 綠頭鴨:預設飛行+嘎嘎叫
Duck duck = new MallardDuck();
PrintMsg(duck); txtMsg.AppendText("\r\n");
// 紅頭鴨:飛行+吱吱叫(動態換叫聲策略)
duck = new RedHeadDuck();
duck.SetQuackBehavior(new Squeak());
PrintMsg(duck); txtMsg.AppendText("\r\n");
// 橡皮鴨:不飛+不叫+游泳(動態換雙策略)
duck = new RubberDuck();
duck.SetFlyBehavior(new FlyNoWay());
duck.SetQuackBehavior(new MuteQuack());
PrintMsg(duck);
txtMsg.AppendText(duck.Swim());
txtMsg.AppendText("\r\n");
}
綠頭鴨正在用翅膀飛行嘎嘎叫
紅頭鴨正在用翅膀飛行吱吱叫
橡皮鴨不會飛不會叫正在游泳

Duck 體系SetFlyBehavior/SetQuackBehavior 動態改變行為,無需建立新子類別策略模式是「組合優於繼承」的教科書級範例,掌握它能讓你在面對多變業務規則時,從容應對而不陷入繼承地獄。