概述策略模式屬於對象的行為模式。其用意是針對一組演算法,將每個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到用戶端的情況下發生變化UML圖策略模式中主要角色這個模式設計到三個角色:
- 環境角色(Context):持有一個Strategy的引用
- 抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或抽象類別實現。此角色給出所有的具體的策略類所需的介面
- 具體策略(ConcreateStrategy)角色:封裝了相關的演算法或行為
使用情境假設現在要設計一個購物車系統,一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這個複雜。例如:對普通會員無折扣,對中級會員提供8折優惠,對進階會員提供7折優惠。根據上述描述,貨品價格是根據以下幾個演算法中的一個進行的:
UML圖實現代碼
<?php/** * 策略抽象類別 * @author wzy * */interface Strategy{ public function calPrice ($price);}/** * 普通會員策略類 * * @author wzy * */class PrimaryStrategy implements Strategy{ public function calPrice ($price) { echo "普通會員無折扣"; return $price; }}/** * 中級會員策略類 * * @author wzy * */class MiddleStrategy implements Strategy{ public function calPrice ($price) { echo "中級會員8折優惠"; return $price * 0.8; }}/** * 進階會員策略類 * * @author wzy * */class HighStrategy implements Strategy{ public function calPrice ($price) { echo "進階會員7折優惠"; return $price * 0.7; }}/** * Context實作類別 * * @author wzy * */class Price{ /** * 具體的策略類對象 * * @var object */ private $strategyInstance; /** * 建構函式,傳入一個具體的策略對象 * * @param object $instance */ public function __construct ($instance) { $this->strategyInstance = $instance; } /** * 計算貨品的價格 * * @param double $price */ public function quote ($price) { return $this->strategyInstance->calPrice($price); }}/** * 用戶端操作 */$high = new HighStrategy();$priceClass = new Price($high);$price = $priceClass->quote(400);echo $price;?>回顧策略模式策略模式的重心不是如何?演算法,而是如何組織、調用這些演算法,從而讓程式結構更靈活,具有更好的擴充性和維護性演算法的平等性策略模式一個很大的特點就是各個策略演算法的平等性。對於一系列具體的策略演算法,大家的地位是一樣的,這樣才能實現演算法之間的互相轉換運行時策略的唯一性運行期間,策略模式在每一個時刻只能使用一個具體的策略實現對象,雖然可以動態地在不同的策略實現中切換,但是同時只有一個