简介
client 收回的申请,都被封装成 Command 对象,每个 Command 对象代表一种操作,Command 具体操作的是 Receiver 对象内的办法。实现动作与指标隔离和复用的目标。
角色
- 形象 Command
- Receiver 真正干活的
- 具体 Command
- Invoker 保护 commands 队列
类图
图中所示,client 调用 Invoker,Invoker 中保护了 commands 队列,每个 command 实际操作的是 TextEditor 这个真正的 Receiver。
代码
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: See, I can do simple things like printing (" . $this->payload . ")\n"; }}class ComplexCommand implements Command{ 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: Complex stuff should be done by a receiver object.\n"; $this->receiver->doSomething($this->a); $this->receiver->doSomethingElse($this->b); }}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"; }}class Invoker{ private $onStart; private $onFinish; public function setOnStart(Command $command): void { $this->onStart = $command; } public function setOnFinish(Command $command): void { $this->onFinish = $command; } public function doSomethingImportant(): void { echo "Invoker: Does anybody want something done before I begin?\n"; if ($this->onStart instanceof Command) { $this->onStart->execute(); } echo "Invoker: ...doing something really important...\n"; echo "Invoker: Does anybody want something done after I finish?\n"; if ($this->onFinish instanceof Command) { $this->onFinish->execute(); } }}$invoker = new Invoker();$invoker->setOnStart(new SimpleCommand("Say Hi!"));$receiver = new Receiver();$invoker->setOnFinish(new ComplexCommand($receiver, "Send email", "Save report"));$invoker->doSomethingImportant();
output:
Invoker: Does anybody want something done before I begin?SimpleCommand: See, I can do simple things like printing (Say Hi!)Invoker: ...doing something really important...Invoker: Does anybody want something done after I finish?ComplexCommand: Complex stuff should be done by a receiver object.Receiver: Working on (Send email.)Receiver: Also working on (Save report.)
本文由mdnice多平台公布