PHP設計モードの戦略モード


概要
ポリシー・モードは、アルゴリズム・ファミリーを定義し、それぞれカプセル化して、互いに置き換えることができます.このモードは、アルゴリズムを使用するお客様とは独立して変化させます.
構成
  • 抽象ポリシーロール:ポリシークラスであり、通常は1つのインタフェースまたは抽象クラスによって実現される.
  • 具体的な戦略役割:関連するアルゴリズムと行為をパッケージしている.
  • 環境役割:1つのポリシークラスの参照を持ち、最終的にクライアントに呼び出す.

  • シーンの適用
  • 複数のクラスは表現行動が異なる場合のみ区別し、ポリシーモードを使用して実行時に具体的に実行する行動を動的に選択することができる.
  • 異なる場合に異なるポリシー(アルゴリズム)を使用する必要があるか、または将来的には他の方法でポリシーが実現される可能性がある.
  • お客様に対して具体的なポリシー(アルゴリズム)の実装の詳細を隠し、互いに完全に独立している.

  • インプリメンテーション
    ステップ
  • 抽象キャラクタクラスの定義(各実装の共通抽象メソッドの定義)
  • 具体的なポリシークラスの定義(親を具体的に実現するための共通の方法)
  • 環境役割クラスの定義(保存インスタンスを受信し、ポリシークラスインタフェースメソッドを統一的に実行する)
  • コード#コード#
    ';
        }
    }
    
    /**
     * Class byBus      
     *    
     */
    class byBus implements Travel {
        public function go()
        {
            echo '       
    '; } } /** * Class byMetro * */ class byMetro implements Travel { public function go() { echo '
    '; } } /** * Class byTrain * */ class byTrain implements Travel { public function go() { echo '
    '; } } /** * Class byAirplane * */ class byAirplane implements Travel { public function go() { echo '
    '; } } /** * Class bySteamship * */ class bySteamship implements Travel { public function go() { echo '
    '; } } /** * Class Mine */ class Mine{ private $_strategy; private $_isChange = false; /** * * , * 1. PHP (DI) (IoC) * @link https://segmentfault.com/a/1190000007209266 * 2. PHP * @link https://segmentfault.com/a/1190000007226476 * * @param Travel $travel */ public function __construct(Travel $travel) { $this->_strategy = $travel; } /** * * * @param Travel $travel */ public function change(Travel $travel) { $this->_strategy = $travel; $this->_isChange = true; } public function goTravel() { if ($this->_isChange) { echo ' ,'; $this->_strategy->go(); } else { $this->_strategy->go(); } } } /** * */ $strategy = new Mine(new byBus()); // $strategy->goTravel(); // $strategy->change(new byMetro()); $strategy->goTravel(); // $strategy->change(new bySelfDriving()); $strategy->goTravel(); //

    実行結果
           
          ,       
          ,         

    メリットとデメリット
    メリット
  • ポリシーパターンは、関連するアルゴリズムファミリーを管理する方法を提供する.ポリシークラスの階層構造は、アルゴリズムまたは動作ファミリーを定義します.継承を適切に使用すると、共通のコードを親に移行し、重複するコードを回避できます.
  • ポリシーパターンは、継承関係を置き換える方法を提供する.継承は、複数のアルゴリズムまたは動作を処理できます.ポリシー・モードを使用しない場合は、アルゴリズムまたは動作を使用する環境クラスにいくつかのサブクラスがあり、各サブクラスは異なるアルゴリズムまたは動作を提供します.しかし,これによりアルゴリズムや行為の利用者はアルゴリズムや行為そのものと混在する.どのアルゴリズムを使用するか、またはどの行為を採用するかを決定する論理は、アルゴリズムまたは行為の論理と混合され、これ以上独立して進化することは不可能である.継承により、アルゴリズムや動作を動的に変更することは不可能になります.
  • 複数条件遷移文の使用を回避するには、ポリシー・モードを使用します.多重転送文はメンテナンスしにくく、どのアルゴリズムを採用するか、どの行為を採用するかの論理とアルゴリズムや行為の論理を混合し、すべて1つの多重転送文の中に列挙され、継承の方法を使用するよりも原始的で遅れている.

  • 欠点
  • クライアントはすべてのポリシークラスを知り、どのポリシークラスを使用するかを自分で決めなければならない.これは、クライアントが適切なアルゴリズムクラスを適時に選択するために、これらのアルゴリズムの違いを理解しなければならないことを意味する.すなわち、ポリシー・モードは、クライアントがすべてのアルゴリズムまたは動作を知っている場合にのみ適用される.
  • ポリシーパターンにより多くのポリシークラスが作成され、各特定のポリシークラスごとに新しいクラスが生成される.環境に依存する状態をクライアントに保存し、ポリシークラスを共有可能に設計することで、ポリシークラスインスタンスを異なるクライアントで使用できる場合があります.言い換えれば、メタモードを使用してオブジェクトの数を減らすことができる.

  • ふろく
  • PHP依存注入(DI)と制御反転(IoC):https://segmentfault.com/a/11...
  • PHPの類型制約を浅く語る:https://segmentfault.com/a/11...