
//BattleStrategy.java
// 戰術策略介面
public interface BattleStrategy {
    void execute();
    String getStrategyName();
    String getDescription();
}
//FrontalAssaultStrategy.java
// 正面突擊策略
public class FrontalAssaultStrategy implements BattleStrategy {
    @Override
    public void execute() {
        System.out.println("騎兵集結完畢!");
        System.out.println("重裝騎兵發起衝鋒,直取敵軍心臟!");
        System.out.println("正面突破敵軍防線,勢如破竹!");
    }
    @Override
    public String getStrategyName() {
        return "正面突擊策略";
    }
    @Override
    public String getDescription() {
        return "適用於敵軍士氣低落或防線薄弱時使用";
    }
}
//RangedSuppressionStrategy.java
// 遠程壓制策略
public class RangedSuppressionStrategy implements BattleStrategy {
    @Override
    public void execute() {
        System.out.println("弓箭手就位,魔法師開始詠唱!");
        System.out.println("箭雨如暴風般傾瀉而下!");
        System.out.println("魔法轟炸覆蓋戰場,敵軍陷入混亂!");
    }
    @Override
    public String getStrategyName() {
        return "遠程壓制策略";
    }
    @Override
    public String getDescription() {
        return "適用於地形開闊,敵軍缺乏掩護時使用";
    }
}
//StealthRaidStrategy.java
// 奇襲策略
public class StealthRaidStrategy implements BattleStrategy {
    @Override
    public void execute() {
        System.out.println("夜幕降臨,刺客小隊悄然行動!");
        System.out.println("潛行繞後,直搗敵軍指揮部!");
        System.out.println("斬首行動成功,敵軍群龍無首!");
    }
    @Override
    public String getStrategyName() {
        return "奇襲策略";
    }
    @Override
    public String getDescription() {
        return "適用於夜戰或敵軍戒備鬆懈時使用";
    }
}
//DefensiveStrategy.java
// 防禦策略
public class DefensiveStrategy implements BattleStrategy {
    @Override
    public void execute() {
        System.out.println("盾牆架起,長槍如林!");
        System.out.println("堅守要塞,以逸待勞!");
        System.out.println("消耗敵軍體力,等待反擊時機!");
    }
    @Override
    public String getStrategyName() {
        return "防禦策略";
    }
    @Override
    public String getDescription() {
        return "適用於敵強我弱或需要拖延時間時使用";
    }
}
//TacticalCommander.java
// 戰術大師指揮官
public class TacticalCommander {
    private BattleStrategy currentStrategy;
    private String commanderName;
    public TacticalCommander(String name) {
        this.commanderName = name;
    }
    // 設定戰術策略
    public void setStrategy(BattleStrategy strategy) {
        this.currentStrategy = strategy;
        System.out.println(commanderName + " 選擇了: " + strategy.getStrategyName());
        System.out.println("策略說明: " + strategy.getDescription());
    }
    // 執行當前策略
    public void executeBattle() {
        if (currentStrategy == null) {
            System.out.println("警告:尚未選擇作戰策略!");
            return;
        }
        System.out.println("\n=== 戰術執行開始 ===");
        System.out.println("指揮官 " + commanderName + " 下達作戰命令:");
        currentStrategy.execute();
        System.out.println("=== 戰術執行完畢 ===\n");
    }
    // 分析戰況並建議策略
    public static void analyzeBattlefield() {
        System.out.println("=== 戰場分析 ===");
        System.out.println("1. 敵軍兵力薄弱,士氣低落 → 建議使用正面突擊");
        System.out.println("2. 地形開闊,敵軍無掩護 → 建議使用遠程壓制");
        System.out.println("3. 夜戰環境,敵軍戒備鬆懈 → 建議使用奇襲策略");
        System.out.println("4. 敵強我弱,需要拖延時間 → 建議使用防禦策略");
        System.out.println("「面對不同的敵人,需有不同的戰法。」\n");
    }
}
//StrategyPatternExample.java
// 使用範例
public class StrategyPatternExample {
    public static void main(String[] args) {
        System.out.println("=== 歡迎來到戰術大師的指揮帳 ===\n");
        // 創建指揮官
        TacticalCommander commander = new TacticalCommander("艾瑞克");
        // 分析戰場情況
        TacticalCommander.analyzeBattlefield();
        // 創建不同的策略
        BattleStrategy frontalAssault = new FrontalAssaultStrategy();
        BattleStrategy rangedSuppression = new RangedSuppressionStrategy();
        BattleStrategy stealthRaid = new StealthRaidStrategy();
        BattleStrategy defensive = new DefensiveStrategy();
        // 場景一:面對士氣低落的敵軍
        System.out.println("【場景一】偵查兵回報:敵軍士氣低落,防線鬆散");
        commander.setStrategy(frontalAssault);
        commander.executeBattle();
        // 場景二:在開闊平原作戰
        System.out.println("【場景二】來到開闊平原,敵軍缺乏掩護");
        commander.setStrategy(rangedSuppression);
        commander.executeBattle();
        // 場景三:夜戰環境
        System.out.println("【場景三】夜幕降臨,適合進行奇襲");
        commander.setStrategy(stealthRaid);
        commander.executeBattle();
        // 場景四:面對強大敵軍
        System.out.println("【場景四】敵軍實力強大,需要保存實力");
        commander.setStrategy(defensive);
        commander.executeBattle();
        /**output
        === 歡迎來到戰術大師的指揮帳 ===
        === 戰場分析 ===
        1. 敵軍兵力薄弱,士氣低落 → 建議使用正面突擊
        2. 地形開闊,敵軍無掩護 → 建議使用遠程壓制
        3. 夜戰環境,敵軍戒備鬆懈 → 建議使用奇襲策略
        4. 敵強我弱,需要拖延時間 → 建議使用防禦策略
        「面對不同的敵人,需有不同的戰法。」
        【場景一】偵查兵回報:敵軍士氣低落,防線鬆散
        艾瑞克 選擇了: 正面突擊策略
        策略說明: 適用於敵軍士氣低落或防線薄弱時使用
        === 戰術執行開始 ===
        指揮官 艾瑞克 下達作戰命令:
        騎兵集結完畢!
        重裝騎兵發起衝鋒,直取敵軍心臟!
        正面突破敵軍防線,勢如破竹!
        === 戰術執行完畢 ===
        【場景二】來到開闊平原,敵軍缺乏掩護
        艾瑞克 選擇了: 遠程壓制策略
        策略說明: 適用於地形開闊,敵軍缺乏掩護時使用
        === 戰術執行開始 ===
        指揮官 艾瑞克 下達作戰命令:
        弓箭手就位,魔法師開始詠唱!
        箭雨如暴風般傾瀉而下!
        魔法轟炸覆蓋戰場,敵軍陷入混亂!
        === 戰術執行完畢 ===
        【場景三】夜幕降臨,適合進行奇襲
        艾瑞克 選擇了: 奇襲策略
        策略說明: 適用於夜戰或敵軍戒備鬆懈時使用
        === 戰術執行開始 ===
        指揮官 艾瑞克 下達作戰命令:
        夜幕降臨,刺客小隊悄然行動!
        潛行繞後,直搗敵軍指揮部!
        斬首行動成功,敵軍群龍無首!
        === 戰術執行完畢 ===
        【場景四】敵軍實力強大,需要保存實力
        艾瑞克 選擇了: 防禦策略
        策略說明: 適用於敵強我弱或需要拖延時間時使用
        === 戰術執行開始 ===
        指揮官 艾瑞克 下達作戰命令:
        盾牆架起,長槍如林!
        堅守要塞,以逸待勞!
        消耗敵軍體力,等待反擊時機!
        === 戰術執行完畢 ===
        */
    }
}
// 戰術策略基類
class BattleStrategy {
  execute() {
    throw new Error("子類必須實現 execute 方法");
  }
  getStrategyName() {
    throw new Error("子類必須實現 getStrategyName 方法");
  }
  getDescription() {
    throw new Error("子類必須實現 getDescription 方法");
  }
}
// 正面突擊策略
class FrontalAssaultStrategy extends BattleStrategy {
  execute() {
    console.log("騎兵集結完畢!");
    console.log("重裝騎兵發起衝鋒,直取敵軍心臟!");
    console.log("正面突破敵軍防線,勢如破竹!");
  }
  getStrategyName() {
    return "正面突擊策略";
  }
  getDescription() {
    return "適用於敵軍士氣低落或防線薄弱時使用";
  }
}
// 遠程壓制策略
class RangedSuppressionStrategy extends BattleStrategy {
  execute() {
    console.log("弓箭手就位,魔法師開始詠唱!");
    console.log("箭雨如暴風般傾瀉而下!");
    console.log("魔法轟炸覆蓋戰場,敵軍陷入混亂!");
  }
  getStrategyName() {
    return "遠程壓制策略";
  }
  getDescription() {
    return "適用於地形開闊,敵軍缺乏掩護時使用";
  }
}
// 奇襲策略
class StealthRaidStrategy extends BattleStrategy {
  execute() {
    console.log("夜幕降臨,刺客小隊悄然行動!");
    console.log("潛行繞後,直搗敵軍指揮部!");
    console.log("斬首行動成功,敵軍群龍無首!");
  }
  getStrategyName() {
    return "奇襲策略";
  }
  getDescription() {
    return "適用於夜戰或敵軍戒備鬆懈時使用";
  }
}
// 防禦策略
class DefensiveStrategy extends BattleStrategy {
  execute() {
    console.log("盾牆架起,長槍如林!");
    console.log("堅守要塞,以逸待勞!");
    console.log("消耗敵軍體力,等待反擊時機!");
  }
  getStrategyName() {
    return "防禦策略";
  }
  getDescription() {
    return "適用於敵強我弱或需要拖延時間時使用";
  }
}
// 戰術大師指揮官
class TacticalCommander {
  constructor(name) {
    this.currentStrategy = null;
    this.commanderName = name;
  }
  // 設定戰術策略
  setStrategy(strategy) {
    this.currentStrategy = strategy;
    console.log(`${this.commanderName} 選擇了: ${strategy.getStrategyName()}`);
    console.log(`策略說明: ${strategy.getDescription()}`);
  }
  // 執行當前策略
  executeBattle() {
    if (!this.currentStrategy) {
      console.log("警告:尚未選擇作戰策略!");
      return;
    }
    console.log("\n=== 戰術執行開始 ===");
    console.log(`指揮官 ${this.commanderName} 下達作戰命令:`);
    this.currentStrategy.execute();
    console.log("=== 戰術執行完畢 ===\n");
  }
  // 分析戰況並建議策略
  static analyzeBattlefield() {
    console.log("=== 戰場分析 ===");
    console.log("1. 敵軍兵力薄弱,士氣低落 → 建議使用正面突擊");
    console.log("2. 地形開闊,敵軍無掩護 → 建議使用遠程壓制");
    console.log("3. 夜戰環境,敵軍戒備鬆懈 → 建議使用奇襲策略");
    console.log("4. 敵強我弱,需要拖延時間 → 建議使用防禦策略");
    console.log("「面對不同的敵人,需有不同的戰法。」\n");
  }
}
// 使用範例
console.log("=== 歡迎來到戰術大師的指揮帳 ===\n");
// 創建指揮官
const commander = new TacticalCommander("艾瑞克");
// 分析戰場情況
TacticalCommander.analyzeBattlefield();
// 創建不同的策略
const frontalAssault = new FrontalAssaultStrategy();
const rangedSuppression = new RangedSuppressionStrategy();
const stealthRaid = new StealthRaidStrategy();
const defensive = new DefensiveStrategy();
// 場景一:面對士氣低落的敵軍
console.log("【場景一】偵查兵回報:敵軍士氣低落,防線鬆散");
commander.setStrategy(frontalAssault);
commander.executeBattle();
// 場景二:在開闊平原作戰
console.log("【場景二】來到開闊平原,敵軍缺乏掩護");
commander.setStrategy(rangedSuppression);
commander.executeBattle();
// 場景三:夜戰環境
console.log("【場景三】夜幕降臨,適合進行奇襲");
commander.setStrategy(stealthRaid);
commander.executeBattle();
// 場景四:面對強大敵軍
console.log("【場景四】敵軍實力強大,需要保存實力");
commander.setStrategy(defensive);
commander.executeBattle();
/** output
=== 歡迎來到戰術大師的指揮帳 ===
=== 戰場分析 ===
1. 敵軍兵力薄弱,士氣低落 → 建議使用正面突擊
2. 地形開闊,敵軍無掩護 → 建議使用遠程壓制
3. 夜戰環境,敵軍戒備鬆懈 → 建議使用奇襲策略
4. 敵強我弱,需要拖延時間 → 建議使用防禦策略
「面對不同的敵人,需有不同的戰法。」
【場景一】偵查兵回報:敵軍士氣低落,防線鬆散
艾瑞克 選擇了: 正面突擊策略
策略說明: 適用於敵軍士氣低落或防線薄弱時使用
=== 戰術執行開始 ===
指揮官 艾瑞克 下達作戰命令:
騎兵集結完畢!
重裝騎兵發起衝鋒,直取敵軍心臟!
正面突破敵軍防線,勢如破竹!
=== 戰術執行完畢 ===
【場景二】來到開闊平原,敵軍缺乏掩護
艾瑞克 選擇了: 遠程壓制策略
策略說明: 適用於地形開闊,敵軍缺乏掩護時使用
=== 戰術執行開始 ===
指揮官 艾瑞克 下達作戰命令:
弓箭手就位,魔法師開始詠唱!
箭雨如暴風般傾瀉而下!
魔法轟炸覆蓋戰場,敵軍陷入混亂!
=== 戰術執行完畢 ===
【場景三】夜幕降臨,適合進行奇襲
艾瑞克 選擇了: 奇襲策略
策略說明: 適用於夜戰或敵軍戒備鬆懈時使用
=== 戰術執行開始 ===
指揮官 艾瑞克 下達作戰命令:
夜幕降臨,刺客小隊悄然行動!
潛行繞後,直搗敵軍指揮部!
斬首行動成功,敵軍群龍無首!
=== 戰術執行完畢 ===
【場景四】敵軍實力強大,需要保存實力
艾瑞克 選擇了: 防禦策略
策略說明: 適用於敵強我弱或需要拖延時間時使用
=== 戰術執行開始 ===
指揮官 艾瑞克 下達作戰命令:
盾牆架起,長槍如林!
堅守要塞,以逸待勞!
消耗敵軍體力,等待反擊時機!
=== 戰術執行完畢 ===
 */
Strategy 設計模式就像我們故事中的多變戰術大師,透過可互換的演算法策略來應對不同的情況
核心特點:
使用時機: