張魁 发表于 2023-1-26 00:27:55

浅谈PHP设计模式的命令模式

简介:

命令模式:属于行为型的设计模式。将一个请求封装为一个对象,从而是你可用不同的请求对客户端进行参数化。对请求排队或记录请求日志,以及支持可撤销的操作。
适用场景:

命令发送者 只需要知道发送 请求对象,不需要知道如何完成请求 ;
命令执行者 只需要知道如何 完成请求,不需要知道请求的发送过程 ;
优点:


[*]封装调用和解耦。
[*]容易的将数据记录到日志。
[*]容易的实现对请求的撤销和重做。
缺点:

增加代码复杂性。。
代码:

*/
/**
* Command接口声明用于执行命令的方法。
*/
interface Command
{
    public function execute(): void;
}

/**
* 一些命令可以自己实现简单的操作。
*/
class SimpleCommand implements Command
{
    private $payload;

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

    public function execute(): void
    {
      echo "SimpleCommand:看,我可以做一些简单的事情,比如打印(" . $this->payload . ")\n";
    }
}

/**
*然而,有些命令可以将更复杂的操作委派给其他对象,*称为“接收器”
*/
class ComplexCommand implements Command
{
    /**
   * @var Receiver
   */
    private $receiver;

    /**
   * 启动接收器方法所需的上下文数据。
   */
    private $a;

    private $b;

    /**
   *复杂命令可以通过构造函数接受一个或多个接收器对象以及*任何上下文数据。
   */
    public function __construct(Receiver $receiver, string $a, string $b)
    {
      $this->receiver = $receiver;
      $this->a = $a;
      $this->b = $b;
    }

    /**
   * 命令可以委托给接收者的任何方法。
   */
    public function execute(): void
    {
      echo "ComplexCommand:复杂的事情应该由接收器对象完成。\n";
      $this->receiver->doSomething($this->a);
      $this->receiver->doSomethingElse($this->b);
    }
}

/**
*Receiver类包含一些重要的业务逻辑。他们知道如何执行与执行请求相关的各种操作。事实上,任何类别都可以充当接收方。
*/
class Receiver
{
    public function doSomething(string $a): void
    {
      echo "Receiver: Working on (" . $a . ".)\n";
    }

    public function doSomethingElse(string $b): void
    {
      echo "Receiver: Also working on (" . $b . ".)\n";
    }
}

/**
*Invoker与一个或多个命令关联。它向*命令发送请求。
*/
class Invoker
{
    /**
   * @var Command
   */
    private $onStart;

    /**
   * @var Command
   */
    private $onFinish;

    /**
   * 初始化命令。
   */
    public function setOnStart(Command $command): void
    {
      $this->onStart = $command;
    }

    public function setOnFinish(Command $command): void
    {
      $this->onFinish = $command;
    }

    /**
   *Invoker不依赖于具体的命令或接收器类。*调用器通过执行*命令将请求间接传递给接收方。
   */
    public function doSomethingImportant(): void
    {
      echo "Invoker: 有人想在我开始之前做点什么吗?\n";
      if ($this->onStart instanceof Command) {
            $this->onStart->execute();
      }

      echo "Invoker: ...做一些非常重要的事情...\n";

      echo "Invoker: 我做完后有人想做什么吗?\n";
      if ($this->onFinish instanceof Command) {
            $this->onFinish->execute();
      }
    }
}

/**
*客户端代码可以使用任何命令参数化调用程序。
*/
$invoker = new Invoker();
$invoker->setOnStart(new SimpleCommand("你好!"));
$receiver = new Receiver();
$invoker->setOnFinish(new ComplexCommand($receiver, "发送电子邮件", "保存报告"));

$invoker->doSomethingImportant();
来源:https://www.cnblogs.com/phpphp/p/17067340.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 浅谈PHP设计模式的命令模式