策略模式定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。 ...
策略模式(Strategy pattern)是行為類模式中的一個類型。行為類模式用來說明一個應用是如何運作的。
策略模式:定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。
- 封裝:把行為用介面封裝起來,我們可以把那些經常變化的部分,從當前的類中單獨取出來,用介面進行單獨的封裝。
- 互相替換:我們封裝好了介面,通過指定不同的介面實現類進行演算法的變化。
<?php /** * 定義介面 */ interface car{ public function run(); } /** * 介面演算法實現 * @return [type] [description] */ class bmwCar implements car{ public function run(){ echo "寶馬汽車在路上賓士\n"; } } /** * 介面演算法實現 * @return [type] [description] */ class audiCar implements car{ public function run(){ echo "奧迪汽車在路上賓士\n"; } } /** * 使用不同演算法的類 * @param integer $speed [description] */ class chooseCar{ public $speed; function __construct($speed=60){ $this->speed = $speed; } function start($brand){ $car = null; switch($brand){ case "bmw": $car = new bmwCar(); break; case "audi": $car = new audiCar(); break; default: $car = new bmwCar(); } $car->run(); echo "時速為{$this->speed}km/h"; } } $car = new chooseCar(180); $car->start("audi");
//輸出
奧迪汽車在路上賓士 時速為180km/h
策略模式會立即改變一個演算法,當我們使用的類比較簡單,但是又相互不關聯,只是在特定行為上有所差異的場景下,策略模式就會十分有用。
就在編程領域之外,有許多例子是關於策略模式的。例如:
如果我需要在早晨從家裡出發去上班,我可以有幾個策略考慮:我可以乘坐地鐵,乘坐公交車,走路或其它的途徑。每個策略可以得到相同的結果,但是使用了不同的資源。