検索
ホームページphp教程php手册PHP设计模式策略模式

PHP设计模式策略模式

Jun 13, 2016 am 09:04 AM
モデル戦略デザインパターン

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产品,我非惯性旋转了。
;
    }
}

/**具体策略角色&mdash;&mdash;Y产品
 * Class YItem
 */
class YItem implements RotateItem
{
    function inertiaRotate()
    {
        echo 我是Y产品,我<span style="'color:">不能</span>惯性旋转。
;
    }

    function unInertisRotate()
    {
        echo 我是Y产品,我非惯性旋转了。
;
    }
}

/**具体策略角色&mdash;&mdash;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();
    }
}

客户端调用代码:

 

 

<!--?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=&#39;color: #ff0000;&#39;-->X产品

; $strategy->getItem('XItem'); $strategy->inertiaRotate(); $strategy->unInertisRotate(); echo Y产品
; $strategy->getItem('YItem'); $strategy->inertiaRotate(); $strategy->unInertisRotate(); echo XY产品
; $strategy->getItem('XYItem'); $strategy->inertiaRotate(); $strategy->unInertisRotate();
优点:

 

1、 策略模式提供了管理相关的算法族的办法。

策略类的等级结构定义了一个算法或行为族。

恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。

2、 策略模式提供了可以替换继承关系的办法。

继承可以处理多种算法或行为。

如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。

3、 使用策略模式可以避免使用多重条件转移语句。

多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。

 

缺点:

1、客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。

2、 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。

有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

 
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。