命令模式:
第一次接触到这个命令模式的时候,感觉它很像一个简化的mvc框架。从不同的路径访问,再由控制器来判断所要调用的具体php文件。
<?php
class CommandContext{ //"命令容器"
private $params = array();
function addParam($key,$val){
$this->params[$key] = $val;
}
function getParam($key){
return $this->params[$key];
}
}
class Controller{
private $cmdContext;
function __construct(){
$this->cmdContext = new CommandContext();
}
//
function getCmdContext(){
return $this->cmdContext;
}
function process(){
$action = $this->cmdContext->getParam("action"); //通过“命令容器”获得命令
$command = CommandFactory::getCommand($action); //将“命令”传给“命令工厂”,得到“命令”所对应的子command类对象
if($command->execute($this->cmdContext)){//调用子类对象的execute方法并判断
//成功
//调用对应视图
}else{
//失败
}
}
}
class CommandFactory{
static function getCommand($cmd){
$file = 'commands/'.$cmd.'Command.php'; //命令所对应的php文件路径
if(! file_exists($file)){
throw new Exception("Could not find file $file");
}
require_once($file);
$class = $cmd.'Command'; //形成类名
if(! class_exists($class)){
throw new Exception("Could not find class $class");
}
$result = new $class();
return $result;
}
}
//commands文件夹内
abstract class Command{
abstract function execute(CommandContext $commandContext);
}
class demoCommand extends Command{
function execute(CommandContext $commandContext){
return "ok";
}
}
//使用代码
$controller = new Controller();
$cmdContext = $controller->getCmdContext();
$cmdContext->addParam("action","demo");
$demo = $controller->process();
?>