PHP の戦略パターンについて話しましょう

青灯夜游
リリース: 2023-04-10 10:50:02
転載
3090 人が閲覧しました

前回の記事「PHP のコマンド モードの詳細分析」では PHP のコマンド モードについて紹介しましたが、この記事では PHP のストラテジ モードについて説明します。

PHP の戦略パターンについて話しましょう

戦略パターンは、ポリシー パターンとも呼ばれ、動作設計パターンです。

Gof クラス図と説明

GoF 定義: 一連のアルゴリズムを定義し、それらを 1 つずつカプセル化し、互換性を持たせます。このパターンでは、アルゴリズムを使用するクライアントとは独立してアルゴリズムを変更できます。

#GoF クラス図

PHP の戦略パターンについて話しましょう

##コード実装

interface Strategy{
    function AlgorithmInterface();
}

class ConcreteStrategyA implements Strategy{
    function AlgorithmInterface(){
        echo "算法A";
    }
}

class ConcreteStrategyB implements Strategy{
    function AlgorithmInterface(){
        echo "算法B";
    }
}

class ConcreteStrategyC implements Strategy{
    function AlgorithmInterface(){
        echo "算法C";
    }
}
ログイン後にコピー
アルゴリズムの抽象化と実装を定義します。

class Context{
    private $strategy;
    function __construct(Strategy $s){
        $this->strategy = $s;
    }
    function ContextInterface(){
        
        $this->strategy->AlgorithmInterface();
    }
}
ログイン後にコピー

実行環境コンテキストを定義します。

$strategyA = new ConcreteStrategyA();
$context = new Context($strategyA);
$context->ContextInterface();

$strategyB = new ConcreteStrategyB();
$context = new Context($strategyB);
$context->ContextInterface();

$strategyC = new ConcreteStrategyC();
$context = new Context($strategyC);
$context->ContextInterface();
ログイン後にコピー

最後に、必要に応じてクライアント側で適切なアルゴリズムが呼び出されます。

とてもシンプルなデザインパターンではないでしょうか。このモデルは、最初に説明した
    Simple Factory
  • に非常に似ていることに気づきましたか?それでは、それらの違いは何でしょうか?
  • ファクトリ関連モードは作成モードです。名前が示すように、このモードはオブジェクトを作成し、新しいオブジェクトを返すために使用されます。オブジェクトのどのメソッドを呼び出すかを決定するのはクライアントです。
  • 戦略モード属性の動作モードは、実行コンテキストを通じて呼び出される関数メソッドをカプセル化します。クライアントは、メソッドを呼び出すだけで済みます。さて、
  • ここでは、クライアントが特定のアルゴリズム クラスをインスタンス化する必要があることがわかりますが、これは
  • Simple Factory
  • ほど簡単に使用できないようです。この場合、試してみてはいかがでしょうか工場を組み合わせるパターンも戦略パターンと合わせて実装してみてはいかがでしょうか? この実装は、考えるための質問として皆さんに任せます。ヒント: Context クラスの __construct を単純なファクトリ メソッドに変換します。
これは、単純な工場, 次に、単純な工場メソッドに従います: 私たちは携帯電話メーカー (クライアント) で、携帯電話のバッチを製造する工場 (ConcreteStrategy) を探したいと考えています。この工場に注文して携帯電話を製造します。チャネルプロバイダー (Context) チャネルプロバイダーはファウンドリ (Strategy) に直接連絡し、完成した携帯電話を私に直接発送します (ContextInterface())。同様に、具体的な実装について気にする必要はなく、問い合わせをしてくるチャネル ベンダーを監視するだけで十分です。

#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/10.strategy/source/strategy.php

# #Example

SMS 機能はまだあります。具体的な要件については、
Simple Factory

モードの説明を参照してください。今回は、ストラテジー モードを使用して実装します。

SMS 送信クラス図

完全なソース コード: https://github.com/zhangyue0503/designpatterns- php /blob/master/10.strategy/source/strategy-message.phpPHP の戦略パターンについて話しましょう

<?php

interface Message
{
    public function send();
}

class BaiduYunMessage implements Message
{
    function send()
    {
        echo &#39;百度云发送信息!&#39;;
    }
}

class AliYunMessage implements Message
{
    public function send()
    {
        echo &#39;阿里云发送信息!&#39;;
    }
}

class JiguangMessage implements Message
{
    public function send()
    {
        echo &#39;极光发送信息!&#39;;
    }
}

class MessageContext
{
    private $message;
    public function __construct(Message $msg)
    {
        $this->message = $msg;
    }
    public function SendMessage()
    {
        $this->message->send();
    }
}

$bdMsg = new BaiduYunMessage();
$msgCtx = new MessageContext($bdMsg);
$msgCtx->SendMessage();

$alMsg = new AliYunMessage();
$msgCtx = new MessageContext($alMsg);
$msgCtx->SendMessage();

$jgMsg = new JiguangMessage();
$msgCtx = new MessageContext($jgMsg);
$msgCtx->SendMessage();
ログイン後にコピー

説明

次のクラスの比較に注意してください。基本的に図と Simple Factory

パターンに違いはありません
  • 戦略パターンはアルゴリズムを定義します。概念的には、これらのアルゴリズムは同じ作業を完了しますが、実装は異なりますが、物事は終わっています、人々 それは生きています。それをどのように使用したいかは、みんなの関心によって決まります。各アルゴリズムには独自のクラスがあり、独自のインターフェイスを通じて個別にテストできるため、戦略モードでは単体テストを最適化できます
  • 元のアドレス: https://juejin.cn/post/6844903955860996110
著者: ハードコア プロジェクト マネージャー

推奨研究: "

PHP ビデオ チュートリアル

>>

以上がPHP の戦略パターンについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート