コマンド モード (コマンド) は、リクエストをオブジェクトにカプセル化し、さまざまなリクエストで顧客をパラメータ化することができ、リクエストをキューに入れたり、リクエスト ログを記録したり、取り消し可能な操作をサポートしたりできます。非常に抽象的な例を見てみましょう:
呼び出し側クラス Invoker と呼び出しリクエストを受信するクラス Receiver があるとします。この 2 つの間で、コマンド クラス Command の実行メソッドを使用してリクエスト呼び出しメソッドをホストします。 , 呼び出し側 Invoker は、クライアント要求を処理するためにコマンド クラスのexecute メソッドを呼び出すことだけを知っているため、受信側と呼び出し側 Invoker の分離が実現されます。
LaravelのArtisanコマンドはコマンドパターンを使用します。
<?phpnamespace DesignPatterns\Behavioral\Command;/** * CommandInterface */interface CommandInterface{ /** * 在命令模式中这是最重要的方法, * Receiver在构造函数中传入. */ public function execute();}
<?phpnamespace DesignPatterns\Behavioral\Command;/** * 这是一个调用Receiver的print方法的命令实现类, * 但是对于调用者而言,只知道调用命令类的execute方法 */class HelloCommand implements CommandInterface{ /** * @var Receiver */ protected $output; /** * 每一个具体的命令基于不同的Receiver * 它们可以是一个、多个,甚至完全没有Receiver * * @param Receiver $console */ public function __construct(Receiver $console) { $this->output = $console; } /** * 执行并输出 "Hello World" */ public function execute() { // 没有Receiver的时候完全通过命令类来实现功能 $this->output->write('Hello World'); }}
<?phpnamespace DesignPatterns\Behavioral\Command;/** * Receiver类 */class Receiver{ /** * @param string $str */ public function write($str) { echo $str; }}
<?phpnamespace DesignPatterns\Behavioral\Command;/** * Invoker类 */class Invoker{ /** * @var CommandInterface */ protected $command; /** * 在调用者中我们通常可以找到这种订阅命令的方法 * * @param CommandInterface $cmd */ public function setCommand(CommandInterface $cmd) { $this->command = $cmd; } /** * 执行命令 */ public function run() { $this->command->execute(); }}
コマンド パターンは、オブジェクトのグループの同様の動作を抽象化し、呼び出し元と呼び出し先を分離し、アプリケーションの柔軟性を向上させます。コマンド パターンは、呼び出しのターゲット オブジェクトの異種性をカプセル化し、統一された方法で呼び出し元にサービスを提供します。