首页  >  文章  >  后端开发  >  php设计模式 Command(命令模式)

php设计模式 Command(命令模式)

高洛峰
高洛峰原创
2016-11-30 09:52:35910浏览

/**
* 命令模式
*
* 将一个请求封装为一个对象从而使你可用不同的请求对客户进行参数化,对请求排除或记录请求日志,以及支持可取消的操作
*/
interface Command
{
public function execute();
}

class Invoker
{
private $_command = array();
public function setCommand($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 Receiver 

private $_name = null; 

public function __construct($name) { 
$this->_name = $name; 


public function action() 

echo $this->_name." action
"; 


public function action1() 

echo $this->_name." action1
"; 



class ConcreteCommand implements Command 

private $_receiver; 
public function __construct($receiver) 

$this->_receiver = $receiver; 


public function execute() 

$this->_receiver->action(); 



class ConcreteCommand1 implements Command 

private $_receiver; 
public function __construct($receiver) 

$this->_receiver = $receiver; 


public function execute() 

$this->_receiver->action1(); 



class ConcreteCommand2 implements Command 

private $_receiver; 
public function __construct($receiver) 

$this->_receiver = $receiver; 


public function execute() 

$this->_receiver->action(); 
$this->_receiver->action1(); 




$objRecevier = new Receiver("No.1"); 
$objRecevier1 = new Receiver("No.2"); 
$objRecevier2 = new Receiver("No.3"); 

$objCommand = new ConcreteCommand($objRecevier); 
$objCommand1 = new ConcreteCommand1($objRecevier); 
$objCommand2 = new ConcreteCommand($objRecevier1); 
$objCommand3 = new ConcreteCommand1($objRecevier1); 
$objCommand4 = new ConcreteCommand2($objRecevier2); // 使用 Recevier的两个方法 

$objInvoker = new Invoker(); 
$objInvoker->setCommand($objCommand); 
$objInvoker->setCommand($objCommand1); 
$objInvoker->executeCommand(); 
$objInvoker->removeCommand($objCommand1); 
$objInvoker->executeCommand(); 

$objInvoker->setCommand($objCommand2); 
$objInvoker->setCommand($objCommand3); 
$objInvoker->setCommand($objCommand4); 
$objInvoker->executeCommand(); 
[/code]

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn