策略模式是一種行為型設計模式,其核心思想是「定義一系列演算法,將每個演算法封裝起來,並使它們可以相互替換」。這讓演算法能獨立於使用它的客戶端而變化,完美體現了面向對象多型的精髓。
假設我們要出門旅遊,可選擇騎自行車、開汽車、搭火車或飛機。每種交通工具代表一種「策略」,具有不同的時間成本與金錢成本。策略模式讓我們能在運行時動態切換出行方式,而不需修改旅遊規劃的核心邏輯。
// 抽象策略介面
interface TravelTool {
public function useTime();
public function money();
}
// 具體策略:飛機
class Plane implements TravelTool {
public function useTime() { return '1 h'; }
public function money() { return '$10'; }
}
// 具體策略:火車
class Train implements TravelTool {
public function useTime() { return '3 h'; }
public function money() { return '$5'; }
}
// 環境類
class doTravel {
public $obj;
public function __construct($method) {
$temp = new ReflectionClass($method);
$this->obj = $temp->newInstance();
}
public function money() { echo $this->obj->money(); }
public function useTime() { echo $this->obj->useTime(); }
}
// 客戶端使用
$obj = new doTravel('Train');
$obj->money(); // 輸出 $5
echo "<br/>";
$obj->useTime(); // 輸出 3 h
if/else 或 switch策略模式適用於系統需要在不同條件下採用不同業務規則、演算法可預見會變化、或需隱藏複雜演算法實作細節的場景。