PHPデザインパターンコマンドモード

PHPデザインパターンコマンドモード

また、アクションまたはトランザクション・モードとして知られているコマンドモード、教材の多くのレストランでは、例に挙げて説明します。私たちの顧客の注文はウェイターによって発行されているように、このコマンドの受信者であるシェフは、このコマンドの実行者である一方で、メニューは、実際のコマンドです。したがって、このモデルは、解決するために何をしますか?あなたは必要とウェイターは彼女が言っているシェフに伝えると述べただけのように、私たちは、お客様やシェフのデカップリング達成したときのコース変更したいとき。デカップリングは、発信者と実装者です。もちろん、これを行うためのデザインパターンの多くが、コマンドモードが操作を行うことができます(サービング、飲み物を取得し、ウェイターの注文)複数のコマンドを達成するためのコマンド受信機を作る、またはそれ以上を達成するためにコマンドを伝えるために(温かい料理、冷たい料理のシェフ、マスター主食を調理)。これは、実際の場所を再生するには、コマンドモードです!

GoFのクラス図と説明

GoFのは、定義された:カプセル化にオブジェクトに対する要求を、このように要求の異なるパラメータを使用してクライアントを作る、要求キューまたはログ要求、および運用支援取り消し可能に

図クラスのGoF

コードの実装
class Invoker
{
    public $command;
    
    public function __construct($command)
    {
        $this->command = $command;
    }

    public function exec()
    {
        $this->command->execute();
    }
}

まず、コマンドの受信者を定義するか、依頼者のコマンドがより適切です。この単語のクラス図の英語の定義は、「人を祈る。」されます それがあることを、その操作でとコマンドを開始します。

abstract class Command
{
    protected $receiver;

    public function __construct(Receiver $receiver)
    {
        $this->receiver = $receiver;
    }

    abstract public function execute();
}

class ConcreteCommand extends Command
{
    public function execute()
    {
        $this->receiver->action();
    }
}

次は私達のあるコマンド、ある「メニュー」。このコマンドの役割は誰が本当のキュータはい定義することです。

class Receiver
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function action()
    {
        echo $this->name . '命令执行了!', PHP_EOL;
    }
}

買収は、あること、俳優は、実際の人々は、コマンドを実行します。

// 准备执行者
$receiverA = new Receiver('A');

// 准备命令
$command = new ConcreteCommand($receiverA);

// 请求者
$invoker = new Invoker($command);
$invoker->exec();

クライアントを呼び出して、我々は良い演奏に連絡する必要があり、コマンドメニュー(コマンド)へ、そして最終的にはウェイター(実行者)への準備ができている料理が上手レストラン(レシーバー)を、選択することです。

  • 実際には、このホテルの例では、コマンドモードを解析するための本当に完璧な、非常に明確にされています
  • それはそれはそれは良いマルチオーダーであるか、または複数の料理人にすることができ、言いましたか?私たちはこの問題を解決するためではない心配、次のコードを実行します。

完全なコード:https://github.com/zhangyue0503/designpatterns-php/blob/master/09.command/source/command.php

<?php

class Invoker
{
    private $command = [];

    public function setCommand(Command $command)
    {
        $this->command[] = $command;
    }

    public function exec()
    {
        if(count($this->command) > 0){
            foreach ($this->command as $command) {
                $command->execute();
            }
        }
    }

    public function undo()
    {
        if(count($this->command) > 0){
            foreach ($this->command as $command) {
                $command->undo();
            }
        }
    }
}

abstract class Command
{
    protected $receiver;
    protected $state;
    protected $name;

    public function __construct(Receiver $receiver, $name)
    {
        $this->receiver = $receiver;
        $this->name = $name;
    }

    abstract public function execute();
}

class ConcreteCommand extends Command
{
    public function execute()
    {
        if (!$this->state || $this->state == 2) {
            $this->receiver->action();
            $this->state = 1;
        } else {
            echo $this->name . '命令正在执行,无法再次执行了!', PHP_EOL;
        }

    }
    
    public function undo()
    {
        if ($this->state == 1) {
            $this->receiver->undo();
            $this->state = 2;
        } else {
            echo $this->name . '命令未执行,无法撤销了!', PHP_EOL;
        }
    }
}

class Receiver
{
    public $name;
    public function __construct($name)
    {
        $this->name = $name;
    }
    public function action()
    {
        echo $this->name . '命令执行了!', PHP_EOL;
    }
    public function undo()
    {
        echo $this->name . '命令撤销了!', PHP_EOL;
    }
}

// 准备执行者
$receiverA = new Receiver('A');
$receiverB = new Receiver('B');
$receiverC = new Receiver('C');

// 准备命令
$commandOne = new ConcreteCommand($receiverA, 'A');
$commandTwo = new ConcreteCommand($receiverA, 'B');
$commandThree = new ConcreteCommand($receiverA, 'C');

// 请求者
$invoker = new Invoker();
$invoker->setCommand($commandOne);
$invoker->setCommand($commandTwo);
$invoker->setCommand($commandThree);
$invoker->exec();
$invoker->undo();

// 新加一个单独的执行者,只执行一个命令
$invokerA = new Invoker();
$invokerA->setCommand($commandOne);
$invokerA->exec();

// 命令A已经执行了,再次执行全部的命令执行者,A命令的state判断无法生效
$invoker->exec();
  • 今回は一回限りの注文数、シェフの多くの問題、また、場合、間違ったコマンドを解決する方法、およびREVOKEの問題を解決します
  • 見ることができ、コマンドモードの動作はオブジェクトと呼ばれ、デカップリングこのオブジェクトが実装を達成する方法を知っているであろう
  • これ以上のエグゼキュータよりも達成するために、マルチコマンド、同様のソートモードの組み合わせに実装
  • この場合、執行には影響しません新しいコマンドを追加し、それが顧客に影響を与えません。新しい顧客が新しいコマンドを必要とするとき、単にコマンドと要求元缶を追加します。でも修正需要ではなく、依頼者を変更します。
  • コマンドモードに見えるLaravelのオブザーバーパターンに加えて、イベントスケジューラのフレームワークも、明らかに

私たちの携帯電話の工場やレストランはありません、我々は携帯電話のファウンドリを作成する必要がある場合、異なるだけでなく、一次、実際には、この順序は、コマンドとして見ることができます。このために、我々はあなたが親切システムのプリインストールされたどのような部品、CPUの種類、メモリの種類を使用する必要があることが必要になります。そして、労働者は、この順序に従って生産のためファブます。プロセスでは、私は気にしない労働者や注文を実行するために労働者のグループです、私はちょうどそれの人々と私たちのお尻にこの順序をしたいし、その後わずかに作ら電話の受け入れを待ちます!

完全なコード:https://github.com/zhangyue0503/designpatterns-php/blob/master/09.command/source/command-up.php

SMS機能が戻ってきた、私たちは、工場出荷時のモードに加えて、のようなコマンドモードルックスもああを達成するための良い方法であることがわかりました。ここでは、我々は再びコマンドモードを実装するためにそれを使用し、使用のSMSそのいくつか残っているとのインタフェースはあまり話をしなかった押してください。もちろん、興味のある友人はその後、私たちのメッセージリコール機能ヘクタールを実現することができ、上記のコマンドキャンセルについて考える達成する方法です。

図SMSクラス

完全なソースコード:https://github.com/zhangyue0503/designpatterns-php/blob/master/09.command/source/command-message.php

<?php

class SendMsg
{
    private $command = [];

    public function setCommand(Command $command)
    {
        $this->command[] = $command;
    }
    
    public function send($msg)
    {
        foreach ($this->command as $command) {
            $command->execute($msg);
        }
    }
}

abstract class Command
{
    protected $receiver = [];

    public function setReceiver($receiver)
    {
        $this->receiver[] = $receiver;
    }

    abstract public function execute($msg);
}

class SendAliYun extends Command
{
    public function execute($msg)
    {
        foreach ($this->receiver as $receiver) {
            $receiver->action($msg);
        }
    }
}

class SendJiGuang extends Command
{
    public function execute($msg)
    {
        foreach ($this->receiver as $receiver) {
            $receiver->action($msg);
        }
    }
}

class SendAliYunMsg
{
    public function action($msg)
    {
        echo '【阿X云短信】发送:' . $msg, PHP_EOL;
    }
}

class SendAliYunPush
{
    public function action($msg)
    {
        echo '【阿X云推送】发送:' . $msg, PHP_EOL;
    }
}

class SendJiGuangMsg
{
    public function action($msg)
    {
        echo '【极X短信】发送:' . $msg, PHP_EOL;
    }
}

class SendJiGuangPush
{
    public function action($msg)
    {
        echo '【极X推送】发送:' . $msg, PHP_EOL;
    }
}

$aliMsg = new SendAliYunMsg();
$aliPush = new SendAliYunPush();
$jgMsg = new SendJiGuangMsg();
$jgPush = new SendJiGuangPush();

$sendAliYun = new SendAliYun();
$sendAliYun->setReceiver($aliMsg);
$sendAliYun->setReceiver($aliPush);

$sendJiGuang = new SendJiGuang();
$sendAliYun->setReceiver($jgMsg);
$sendAliYun->setReceiver($jgPush);

$sendMsg = new SendMsg();
$sendMsg->setCommand($sendAliYun);
$sendMsg->setCommand($sendJiGuang);

$sendMsg->send('这次要搞个大活动,快来注册吧!!');
説明
  • この例では、コマンドはまだマルチモード、マルチパフォーマーです
  • コマンドモードがある一方、この例では、抽象工場と対比達成するために、異なるデザインパターンを使用して、同じ機能の行為を選択するが、より抽象的な工場は、オブジェクトを返すオブジェクトを生成することであることを承知しているであろう
  • コマンドは1回のダウンで1を実行できるように私たちは、コマンドモードは、コマンドキュー、マルチコマンドの形成のための理想的なことがわかります
  • 実装者が話すことより右持っているように、それは受信者が拒否権かどうかを要求、受信者を決定することができます
公開された41元の記事 ウォンの賞賛6 ビュー50000 +

おすすめ

転載: blog.csdn.net/bujidexinq/article/details/104957279