简介
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 多平台公布