策略模式屬於行為型模式。核心思想:定義一族算法,封裝每個算法,使它們可互換。 將「使用算法」與「算法實現」分離,讓算法變化不影響客戶端。

public class PriceCalculator {
private static final int BUS = 1, SUBWAY = 2, TAXI = 3;
public int calculatePrice(int km, int type) {
if (type == BUS) return busPrice(km);
else if (type == SUBWAY) return subwayPrice(km);
else return taxiPrice(km); // 新增出租車需改此處
}
// ... 私有計算方法
}
public interface CalculateStrategy { int calculatePrice(int km); }
2. 實現具體策略
// 公交策略
public class BusStrategy implements CalculateStrategy {
public int calculatePrice(int km) {
int extra = km - 10;
int price = 1 + (extra / 5) * 1;
return (extra % 5 > 0) ? ++price : price;
}
}
// 地鐵策略
public class SubwayStrategy implements CalculateStrategy { /* 分段計價邏輯 */ }
// 出租車策略
public class TaxiStrategy implements CalculateStrategy { public int calculatePrice(int km) { return km * 2; } }
3. Context 角色
public class TrafficCalculator {
private CalculateStrategy strategy;
public void setStrategy(CalculateStrategy strategy) { this.strategy = strategy; }
public int calculatePrice(int km) { return strategy.calculatePrice(km); }
public static void main(String[] args) {
TrafficCalculator c = new TrafficCalculator();
c.setStrategy(new BusStrategy());
System.out.println("公交10公里: " + c.calculatePrice(10));
}
}
| 優點 | 缺點 |
|---|---|
| 結構清晰、擴展性強、符合開閉原則 | 策略類數量增加,需客戶端知曉所有策略 |
| 避免大量條件分支,邏輯解耦 | 適用於行為相近的算法族,不適用於流程差異大的場景 |