<?php
/**
* 抽象出命令,简化命令调用类的设计,并且命令本身可扩展
* 与中介模式的区别是,中介模式是多对多对象通信的抽象,把多对多的关系转换成一对多,更容易维护
* 并且减少了对象的数目
* 命令模式是对调用对象方法的抽象,对命令的抽象,对命令的接收者没有改变,简化了命令的发出者的设计
* 命令的发出者只对命令接口进行设计
*/
interface ICommand {
function execute();
}
class CommandOpen implements ICommand {
private $_receiver = null;
private $_state = null;
public function __construct($receiver) {
$this->_receiver = $receiver;
}
public function execute() {
$this->_receiver->actionOpen();
}
}
class CommandClose implements ICommand {
private $_receiver = null;
private $_state = null;
public function __construct($receiver) {
$this->_receiver = $receiver;
}
public function execute() {
$this->_receiver->actionClose();
}
}
class ReceiverTv {
/**
* 真正执行命令相应的打开操作
*/
public function actionOpen(){
print_ln(__METHOD__);
}
/**
* 真正执行命令相应的关闭操作
*/
public function actionClose(){
print_ln(__METHOD__);
}
/**
* 真正执行命令相应的换频道操作
*/
public function actionChange(){
print_ln(__METHOD__);
}
}
/**
* 调用者Invoker:遥控器
*/
class InvokerControler {
/**
* 持有命令对象
*/
private $_commands = null; /**
* 设置调用者持有的命令对象
* @param command 命令对象
*/
public function addCommand($command) {
$classname = get_class($command);
$this->_commands[$classname] = $command;
}
/**
* 示意方法,要求命令执行请求
*/
public function runCommand($cmdName) {
$this->_commands[$cmdName]->execute();
}
}
class Client {
/**
* 示意,负责创建命令对象,并设定它的接收者
*/
public static function main(){
$receiver = new ReceiverTV();
$invoker = new InvokerControler();
$commandOpen = new CommandOpen($receiver);
$invoker->addCommand($commandOpen);
$commandClose = new CommandClose($receiver);
$invoker->addCommand($commandClose);
$invoker->runCommand(get_class($commandOpen));
$invoker->runCommand(get_class($commandClose));
}
}
Client::main();