php-命令模式实现
概述
命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
以摩托制造厂为例,车间主任需向生产线分配生产命令。此处可以用命令模式实现
模式结构
- Command - 命令接口
- Invoker - 命令调度者
- workShop - 生产线接受命令
- workShopDirector -车间主任-分配命令给生产线
UML图例
代码实例
<?php
//命令接口
interface Command
{
public function execute();
}
//命令调度者
class Invoker
{
//命令列表
private $_command = array();
//新增命令
public function addCommand($command)
{
$this->_command[] = $command;
}
//执行命令
public function executeCommand()
{
foreach ($this->_command as $command) {
$command->execute();
}
}
//移除命令
public function removeCommand($command)
{
$key = array_search($command, $this->_command);
if ($key !== false) {
unset($this->_command[$key]);
}
}
}
//生产线接受命令
class workShop
{
private $_production_line = null;
public function __construct($productionLine) {
$this->_production_line = $productionLine;
}
public function action()
{
echo $this->_production_line." 执行攻击命令开始组装摩托车<br />";
}
}
//车间主任-分配命令给生产线
class workShopDirector implements Command{
private $_work_shop;
public function __construct($_work_shop)
{
$this->_work_shop = $_work_shop;
}
//执行命令
public function execute()
{
$this->_work_shop->action();
}
}
$workShopA = new workShop("生产线1");
$workShopB = new workShop("生产线2");
$workShopDirectorA = new workShopDirector($workShopA);
$workShopDirectorB = new workShopDirector($workShopB);
$objInvoker = new Invoker();
$objInvoker->addCommand($workShopDirectorA);
$objInvoker->addCommand($workShopDirectorB);
$objInvoker->executeCommand();
模式分析
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
- 每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
- 命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
- 命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
- 命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
优缺点
命令模式的优点
- 降低系统的耦合度。
- 新的命令可以很容易地加入到系统中。
- 可以比较容易地设计一个命令队列和宏命令(组合命令)。
- 可以方便地实现对请求的Undo和Redo。
命令模式的缺点
- 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
适用环境
在以下情况下可以使用命令模式:
- 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
- 系统需要在不同的时间指定请求、将请求排队和执行请求。
- 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
- 系统需要将一组操作组合在一起,即支持宏命令
关注微信公众号(yuantanphp) | |
---|---|
回复关键字 设计模式 可获取以下材料 《设计模式:可复用面向对象软件的基础》pdf版. php设计模式23种实例实现php源码 |