聲明:本系列博客參考資料《大話設計模式》,作者程傑。
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化,即封裝變化的算法。
適用場景:
1、 多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。
2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。
3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。
4、客戶端必須知道所有的策略類,並自行決定使用哪一個策略類,策略模式只適用於客戶端知道所有的算法或行為的情況。
5、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。
有時候可以通過把依賴於環境的狀態保存到客戶端裡面,可以使用享元模式來減少對象的數量。
UML類圖:
角色分析:
抽象策略角色(RotateItem):策略類,通常由一個接口或者抽象類實現。
具體策略角色(ItemX):包裝了相關的算法和行為。
環境角色(ItemContext):持有一個策略類的引用,最終給客戶端調用。
具體代碼實現:
; } function unInertisRotate() { echo 我是X產品,我非慣性旋轉了。 ; } } /**具體策略角色——Y產品 * Class YItem */ class YItem implements RotateItem { function inertiaRotate() { echo 我是Y產品,我不能慣性旋轉。 ; } function unInertisRotate() { echo 我是Y產品,我非慣性旋轉了。 ; } } /**具體策略角色——XY產品 * Class XYItem */ class XYItem implements RotateItem { function inertiaRotate() { echo 我是XY產品,我慣性旋轉。 ; } function unInertisRotate() { echo 我是XY產品,我非慣性旋轉了。 ; } } class contextStrategy { private $item; function getItem($item_name) { try { $class=new ReflectionClass($item_name); $this->item=$class->newInstance(); } catch(ReflectionException $e) { $this->item=; } } function inertiaRotate() { $this->item->inertiaRotate(); } function unInertisRotate() { $this->item->unInertisRotate(); } }