設計モード-戦略モード(行動型-HPケースプロファイリング)


1、策略のモード----(一連のアルゴリズムを定義して、それぞれのアルゴリズムをカプセル化して、そしてそれらを互いに交換することができる.このモードはアルゴリズムをそれを使う取引先と独立して変化させることができる.1種の行為のモードである.)
 
ポリシー・モードには3つのロールが含まれています
1抽象ポリシーロール:通常、インタフェースまたは抽象クラスによって実装されるポリシークラス.
2具体的なポリシーロール:関連するアルゴリズムと動作がパッケージされています.
3環境ロール:ポリシークラスの参照を持ち、最終的にクライアントに呼び出されます.
例を挙げます:多くのソート方法があって、私は1つのソートクラスを書くことができて、すべてのソートアルゴリズムは1つの方法を書いて、クライアントが呼び出す時、すべての方法を知っていればいいです.しかし、新しいアルゴリズムが追加された場合、またはあるアルゴリズムが書き換えられた場合、このアルゴリズムクラスを修正する必要があります.このアルゴリズムクラスが大きいと,メンテナンスが難しくなる.
ポリシーモードは,オブジェクト自体(構成クラス)とアルゴリズムクラス(具体的なアルゴリズムクラス)を区別する.このようなアルゴリズムクラスの修正は,新たに追加され,他のクラスの修正には関係なく,ユーザがアルゴリズムを自分で置き換えることができる.
 
 
メリット:
1、戦略モードは関連するアルゴリズムファミリーを管理する方法を提供する.ポリシークラスの階層構造は、アルゴリズムまたは動作ファミリーを定義します.継承を適切に使用すると、共通のコードを親に移行し、重複するコードを回避できます.
2、ポリシーモードは継承関係を置き換える方法を提供する.継承は、複数のアルゴリズムまたは動作を処理できます.ポリシー・モードを使用しない場合は、アルゴリズムまたは動作を使用する環境クラスにいくつかのサブクラスがあり、各サブクラスは異なるアルゴリズムまたは動作を提供します.しかし,これによりアルゴリズムや行為の利用者はアルゴリズムや行為そのものと混在する.どのアルゴリズムを使用するか、またはどの行為を採用するかを決定する論理は、アルゴリズムまたは行為の論理と混合され、これ以上独立して進化することは不可能である.継承により、アルゴリズムや動作を動的に変更することは不可能になります.
3.ポリシー・モードを使用すると、多重条件遷移文の使用を回避できます.多重転送文はメンテナンスしにくく、どのアルゴリズムを採用するか、どの行為を採用するかの論理とアルゴリズムや行為の論理を混合し、すべて1つの多重転送文の中に列挙され、継承の方法を使用するよりも原始的で遅れている.
 
欠点:
1、クライアントはすべてのポリシークラスを知っていて、どのポリシークラスを使用するかを自分で決定しなければならない.これは、クライアントが適切なアルゴリズムクラスを適時に選択するために、これらのアルゴリズムの違いを理解しなければならないことを意味する.すなわち、ポリシー・モードは、クライアントがすべてのアルゴリズムまたは動作を知っている場合にのみ適用される.
2、ポリシーモードは多くのポリシークラスをもたらし、各具体的なポリシークラスは新しいクラスを生成する.環境に依存する状態をクライアントに保存し、ポリシークラスを共有可能に設計することで、ポリシークラスインスタンスを異なるクライアントで使用できる場合があります.言い換えれば、メタモードを使用してオブジェクトの数を減らすことができる.
 
2、コード設計例
 
a、InterfaceExportインタフェース

b、具体的な策略の役割
 

 
c、環境役割
instance = $class->newInstance();
        } catch (\Exception $exception) {
            $this->instance = null;
        }
    }


    /**
     *       config
     */
    public function config()
    {
        $this->instance->config();
    }


    /***
     *       export
     */
    public function export()
    {
        $this->instance->export();
    }


}

ps:以上はポリシーモードに基づいて設計された異なるエクスポートスキームに対する設計である


//    
//PdfExport
$exportObj=new ExecExport();
$exportObj->createInstance('App\Modules\ModuleShop\Libs\VerifyLog\PdfExport');
$exportObj->config();
$exportObj->export();
//CsvExport
$exportObj=new ExecExport();
$exportObj->createInstance('App\Modules\ModuleShop\Libs\VerifyLog\CsvExport');
$exportObj->config();
$exportObj->export();
//HtmlExport
$exportObj=new ExecExport();
$exportObj->createInstance('App\Modules\ModuleShop\Libs\VerifyLog\HtmlExport');
$exportObj->config();
$exportObj->export();


#    
App\Modules\ModuleShop\Libs\VerifyLog\PdfExport::config--  -config  
 App\Modules\ModuleShop\Libs\VerifyLog\PdfExport::export--  -export  
 App\Modules\ModuleShop\Libs\VerifyLog\CsvExport::config--  -config  
 App\Modules\ModuleShop\Libs\VerifyLog\CsvExport::export--  -export  
 App\Modules\ModuleShop\Libs\VerifyLog\HtmlExport::config--  -config   
App\Modules\ModuleShop\Libs\VerifyLog\HtmlExport::export--  -export