1. 程式人生 > >PHP設計模式——策略模式

PHP設計模式——策略模式

宣告:本系列部落格參考資料《大話設計模式》,作者程傑。

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

       適用場景:

       1、 多個類只區別在表現行為不同,可以使用Strategy模式,在執行時動態選擇具體要執行的行為

       2、 需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實現

       3、 對客戶隱藏具體策略(演算法)的實現細節,彼此完全獨立

       4、客戶端必須知道所有的策略類,並自行決定使用哪一個策略類,策略模式只適用於

客戶端知道所有的演算法或行為的情況

       5、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。

       有時候可以通過把依賴於環境的狀態儲存到客戶端裡面,可以使用享元模式來減少物件的數量。

       UML類圖:

      

         角色分析:        

         抽象策略角色(RotateItem):策略類,通常由一個介面或者抽象類實現。

        具體策略角色(ItemX):包裝了相關的演算法和行為。

        環境角色(ItemContext):持有一個策略類的引用,最終給客戶端呼叫。

        具體程式碼實現:

<?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/5/16
 * Time: 21:46
 */

/**抽象策略角色
 * Interface RotateItem
 */
interface RotateItem
{
    function inertiaRotate();
    function unInertisRotate();
}

/**具體策略角色——X產品
 * Class XItem
 */
class XItem implements RotateItem
{
    function inertiaRotate()
    {
        echo "我是X產品,我慣性旋轉了。<br/>";
    }

    function unInertisRotate()
    {
        echo "我是X產品,我非慣性旋轉了。<br/>";
    }
}

/**具體策略角色——Y產品
 * Class YItem
 */
class YItem implements RotateItem
{
    function inertiaRotate()
    {
        echo "我是Y產品,我<span style='color: #ff0000;'>不能</span>慣性旋轉。<br/>";
    }

    function unInertisRotate()
    {
        echo "我是Y產品,我非慣性旋轉了。<br/>";
    }
}

/**具體策略角色——XY產品
 * Class XYItem
 */
class XYItem implements RotateItem
{
    function inertiaRotate()
    {
        echo "我是XY產品,我慣性旋轉。<br/>";
    }

    function unInertisRotate()
    {
        echo "我是XY產品,我非慣性旋轉了。<br/>";
    }
}

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

          客戶端呼叫程式碼:
<?php
/**
 * Created by PhpStorm.
 * User: Jiang
 * Date: 2015/5/16
 * Time: 21:46
 */

header("Content-Type:text/html;charset=utf-8");

require_once "./Strategy/Strategy.php";

$strategy=new contextStrategy();

echo "<span style='color: #ff0000;'>X產品</span><hr/>";
$strategy->getItem('XItem');
$strategy->inertiaRotate();
$strategy->unInertisRotate();

echo "<span style='color: #ff0000;'>Y產品</span><hr/>";
$strategy->getItem('YItem');
$strategy->inertiaRotate();
$strategy->unInertisRotate();

echo "<span style='color: #ff0000;'>XY產品</span><hr/>";
$strategy->getItem('XYItem');
$strategy->inertiaRotate();
$strategy->unInertisRotate();

            優點:      

            1、 策略模式提供了管理相關的演算法族的辦法。

             策略類的等級結構定義了一個演算法或行為族。

             恰當使用繼承可以把公共的程式碼轉移到父類裡面,從而避免重複的程式碼。

            2、 策略模式提供了可以替換繼承關係的辦法。

               繼承可以處理多種演算法或行為。

               如果不是用策略模式,那麼使用演算法或行為的環境類就可能會有一些子類,每一個子類提供一個不同的演算法或行為。但是,這樣一來演算法或行為的使用者就和演算法或行為本身混在一起。決定使用哪一種演算法或採取哪一種行為的邏輯就和演算法或行為的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態改變演算法或行為變得不可能。

           3、 使用策略模式可以避免使用多重條件轉移語句。

             多重轉移語句不易維護,它把採取哪一種演算法或採取哪一種行為的邏輯與演算法或行為的邏輯混合在一起,統統列在一個多重轉移語句裡面,比使用繼承的辦法還要原始和落後。

           缺點:

            1、客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。

             這就意味著客戶端必須理解這些演算法的區別,以便適時選擇恰當的演算法類。換言之,策略模式只適用於客戶端知道所有的演算法或行為的情況。

            2、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。

            有時候可以通過把依賴於環境的狀態儲存到客戶端裡面,而將策略類設計成可共享的,這樣策略類例項可以被不同客戶端使用。換言之,可以使用享元模式來減少物件的數量。

         歡迎關注我的視訊課程,地址如下,謝謝。


相關推薦

PHP設計模式-策略模式

行為 一個 文件 ech 策略 something protected this cte <?php//策略模式//將一組特定的算法或行為 封裝成一個類,以適應上下文環境//策略的接口文件 約定策略的行為 針對一種情況 產生具體的策略interface Policy

PHP設計模式 -- 策略模式

所有 約定 IT 傳統 else emc 區別 ima TP 策略模式:   6、將一組特定的行為和算法封裝成類,以適應某些特定的上下文環境。   1、 多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。 2、 需要在

初探PHP面向物件與設計模式-策略模式

1. 什麼是策略模式 簡單的講就是實現一個問題的多種方法就是策略設計模式,我們在開發微信公眾號時,有一組被動接收微信訊息的介面(例如:普通文字訊息、關注事件訊息、取消關注事件訊息……),針對不同的訊息有多種處理方式,有處理文字有處理關注事件的等等我們使用的邏輯演算法都不一樣,當然啦業

設計模式PHP專案應用——策略模式設計商場收銀系統

1 策略模式簡介     策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化。     2 模式組成     1)抽象策略角色(Strategy):             策略類,通常由一個介面或

PHP設計模式——策略模式

宣告:本系列部落格參考資料《大話設計模式》,作者程傑。        策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。策略模式讓演算法獨立於使用它的客戶而獨立變化,

設計模式PHP專案應用——策略模式設計自動駕駛系統

1 前言         關於策略模式的定義,模式組成,模式核心思想,模式架構圖,程式架構等基礎知識介紹。請先參考我的另外一篇部落格《(三)設計模式之PHP專案應用(策略模式:商場收銀系統)》:http://blog.csdn.net/clevercode/article/

設計模式——策略模式

contex mas bob listbox inf items 收銀系統 setter .com 聲明:以下內容來源於《大話設計模式》,學習。 策略模式:定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。 商場收費策略:正

設計模式策略模式

onclick sea func cal sdn 不同的 memory hide http 參考http://blog.csdn.net/calmreason/article/details/51029285 定義一系列相同的算法 根據不同需求選擇不同的算法策略 代碼

C++設計模式——策略模式

code spa fine 技術分享 pin ati first virtual headfirst 模式定義:策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。 舉個例子來説,不同鴨子的行爲是不同的,我們可以把變化的行爲提

Java 設計模式策略模式

ember edm 等級 dia span private edi concrete tin   在閻宏博士的《JAVA與模式》一書中開頭是這樣描述策略(Strategy)模式的:   策略模式屬於對象的行為模式。其用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的

設計模式之——淺談strategy模式(策略模式)

兩個 事情 操作 none 要去 編碼 淺談 一點 進行 strategy模式,即策略模式。個人覺得吧,策略模式更多的是一種思維方式。 首先我們要知道,為什麽需要策略模式。舉個例子,比如用程序輸出今天下午去玩什麽。 PlayGame 玩遊戲 package site.wa

設計模式---策略模式

不同的 ext 減少 交互 運行時 系列 使用 增加 策略 策略模式:它定義算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。 Context(應用場景): 1. 需要使用ConcreteStrategy提供的算法。 2. 內部

(轉)設計模式——策略模式

提高 {} xiang 有一個 ble 問題 其它 add 新的 轉載地址:http://blog.csdn.net/lifuxiangcaohui/article/details/8065059 這篇文章講述的策略模式非常棒,在此轉載。 設計模式; 一個程序員對設計模

Python設計模式——策略模式(孫悟空用什麽打妖怪)

就是 作用 oop 事情 input 邏輯控制 except exce one #coding:utf-8 ''' 策略模式作用: 就是使用多種算法來解決一個問題,最大的特性的是:能夠在運行時透明地切換算法(客戶端代碼對變化無感知)

C# - 設計模式 - 策略模式

變化 繼承 否則 www. 默認 ref 獨立 UNC int 策略模式 問題場景 多個類型都有一些共同的屬性和方法,可以稱這些成員為行為,為了避免重復在多個類型中編碼相同部分的行為,應考慮將這些行為定義在抽象類(超類)中,利用繼承時多個類型可以共享這些行為。比如定義一

Java設計模式----------策略模式

用戶 無法 提交 main 遊戲 抽象 可能 測試類 ide 以下內容來自HeadFIrst設計模式一書和http://www.cnblogs.com/xrq730/p/4906313.html的博文,作為自己的學習筆記總結如下。 HeadFirst設計模式一書在開篇就

設計模式-策略模式

設計模式 策略模式 public abstract class baseClass { public abstract double getResult(double num1,double num2); } public class A:baseClass { pub

java設計模式-策略模式

temp return private 數組排序 寫法 冒泡 有一種 eth RF 背景:將一個數組排序,並且打印; 1.下面使用選擇排序、和冒泡排序來寫:                         public class Test { public

設計模式-策略模式(strategy pattern)

pre rac uml類圖 獨立 CA 使用 dep () nes 來說說設計模式吧,最近開始看設計模式,覺得挺有意思的。設計模式網上的資料的挺多的,而且大部分是大家相互轉來轉去的。感覺也挺沒有意思。我就自己寫一點吧! 開始 學習設計模式,我

Java常用設計模式——策略模式

nts static 管理 選擇 span disco rri contex 由於 策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換,策略模式讓算法獨立於使用它的客戶而獨立變化。策略模式使這些算法在客戶端調用它們的時候能夠互不影響地變化