程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP設計模式——策略模式

PHP設計模式——策略模式

編輯:關於PHP編程

PHP設計模式——策略模式


聲明:本系列博客參考資料《大話設計模式》,作者程傑。

 

策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化,即封裝變化的算法。


適用場景:

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();
    }
}

客戶端調用代碼: