命令模式就和名字一样;
比较适合执行命令的场景;
命令发送者只管调用具体命令类中的 execute() 方法;
然后在具体命令类中设定命令接收者;
可以消除命令发送者和命令接受者之间的耦合;
并且可以方便的扩展新命令;
CommandInterface:命令抽象类;一般会暴露一个 execute 方法;
Command:具体的命令类;设定接收者;
Invoker:命令发送者;用于调用命令;
Receiver: 命令接收者;负责执行操作;
CommandInterface.php
<?php
namespace Baijunyao\DesignPatterns\Command;
/**
* Interface CommandInterface
*
* @package Baijunyao\DesignPatterns\Command
*/
interface CommandInterface
{
/**
* @return mixed
*/
public function execute();
}
具体的命令类;
Command.php
<?php
namespace Baijunyao\DesignPatterns\Command;
/**
* 具体命令类
*
* @package Baijunyao\DesignPatterns\Command
*/
class Command implements CommandInterface
{
/**
* @var \Baijunyao\DesignPatterns\Command\Receiver
*/
protected $receiver;
/**
* Command constructor.
*
* @param \Baijunyao\DesignPatterns\Command\Receiver $receiver
*/
public function __construct(Receiver $receiver)
{
$this->receiver = $receiver;
}
/**
* @return mixed|void
*/
public function execute()
{
$this->receiver->action();
}
}
命令发送者
<?php
namespace Baijunyao\DesignPatterns\Command;
/**
* 命令发送者
*
* @package Baijunyao\DesignPatterns\Command
*/
class Invoker
{
/**
* @var
*/
protected $command;
/**
* @param \Baijunyao\DesignPatterns\Command\Command $command
*/
public function setCommand(Command $command)
{
$this->command = $command;
}
/**
* 执行
*/
public function run()
{
$this->command->execute();
}
}
命令接受者
<?php
namespace Baijunyao\DesignPatterns\Command;
/**
* 命令接收者
*
* @package Baijunyao\DesignPatterns\Command
*/
class Receiver
{
/**
* 执行操作
*/
public function action()
{
echo '执行操作';
}
}
运行;
index.php
<?php
namespace Baijunyao\DesignPatterns\Command;
require __DIR__.'/../vendor/autoload.php';
/**
* 客户端
*
* Class Client
* @package Baijunyao\DesignPatterns\Command
*/
class Client
{
/**
* 运行
*/
public function run()
{
// 命令行类设定接受者
$receiver = new Receiver();
$command = new Command($receiver);
// 命令接受者调用命令
$invoker = new Invoker();
$invoker->setCommand($command);
$invoker->run();
}
}
$client = new Client();
$client->run();
但是正如代码所示;
本来只是要执行一个方法;
却分成了3个类显的略微繁琐;
github示例:https://github.com/baijunyao/design-patterns/tree/master/Command
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
最新评论