简介

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