翼度科技»论坛 编程开发 PHP 查看内容

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

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
简介:

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

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


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

增加代码复杂性。。
代码:
  1. */
  2. /**
  3. * Command接口声明用于执行命令的方法。
  4. */
  5. interface Command
  6. {
  7.     public function execute(): void;
  8. }
  9. /**
  10. * 一些命令可以自己实现简单的操作。
  11. */
  12. class SimpleCommand implements Command
  13. {
  14.     private $payload;
  15.     public function __construct(string $payload)
  16.     {
  17.         $this->payload = $payload;
  18.     }
  19.     public function execute(): void
  20.     {
  21.         echo "SimpleCommand:看,我可以做一些简单的事情,比如打印(" . $this->payload . ")\n";
  22.     }
  23. }
  24. /**
  25. *然而,有些命令可以将更复杂的操作委派给其他对象,*称为“接收器”
  26. */
  27. class ComplexCommand implements Command
  28. {
  29.     /**
  30.      * @var Receiver
  31.      */
  32.     private $receiver;
  33.     /**
  34.      * 启动接收器方法所需的上下文数据。
  35.      */
  36.     private $a;
  37.     private $b;
  38.     /**
  39.      *复杂命令可以通过构造函数接受一个或多个接收器对象以及*任何上下文数据。
  40.      */
  41.     public function __construct(Receiver $receiver, string $a, string $b)
  42.     {
  43.         $this->receiver = $receiver;
  44.         $this->a = $a;
  45.         $this->b = $b;
  46.     }
  47.     /**
  48.      * 命令可以委托给接收者的任何方法。
  49.      */
  50.     public function execute(): void
  51.     {
  52.         echo "ComplexCommand:复杂的事情应该由接收器对象完成。\n";
  53.         $this->receiver->doSomething($this->a);
  54.         $this->receiver->doSomethingElse($this->b);
  55.     }
  56. }
  57. /**
  58. *Receiver类包含一些重要的业务逻辑。他们知道如何执行与执行请求相关的各种操作。事实上,任何类别都可以充当接收方。
  59. */
  60. class Receiver
  61. {
  62.     public function doSomething(string $a): void
  63.     {
  64.         echo "Receiver: Working on (" . $a . ".)\n";
  65.     }
  66.     public function doSomethingElse(string $b): void
  67.     {
  68.         echo "Receiver: Also working on (" . $b . ".)\n";
  69.     }
  70. }
  71. /**
  72. *Invoker与一个或多个命令关联。它向*命令发送请求。
  73. */
  74. class Invoker
  75. {
  76.     /**
  77.      * @var Command
  78.      */
  79.     private $onStart;
  80.     /**
  81.      * @var Command
  82.      */
  83.     private $onFinish;
  84.     /**
  85.      * 初始化命令。
  86.      */
  87.     public function setOnStart(Command $command): void
  88.     {
  89.         $this->onStart = $command;
  90.     }
  91.     public function setOnFinish(Command $command): void
  92.     {
  93.         $this->onFinish = $command;
  94.     }
  95.     /**
  96.      *Invoker不依赖于具体的命令或接收器类。*调用器通过执行*命令将请求间接传递给接收方。
  97.      */
  98.     public function doSomethingImportant(): void
  99.     {
  100.         echo "Invoker: 有人想在我开始之前做点什么吗?\n";
  101.         if ($this->onStart instanceof Command) {
  102.             $this->onStart->execute();
  103.         }
  104.         echo "Invoker: ...做一些非常重要的事情...\n";
  105.         echo "Invoker: 我做完后有人想做什么吗?\n";
  106.         if ($this->onFinish instanceof Command) {
  107.             $this->onFinish->execute();
  108.         }
  109.     }
  110. }
  111. /**
  112. *客户端代码可以使用任何命令参数化调用程序。
  113. */
  114. $invoker = new Invoker();
  115. $invoker->setOnStart(new SimpleCommand("你好!"));
  116. $receiver = new Receiver();
  117. $invoker->setOnFinish(new ComplexCommand($receiver, "发送电子邮件", "保存报告"));
  118. $invoker->doSomethingImportant();
复制代码
来源:https://www.cnblogs.com/phpphp/p/17067340.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具