当前位置:Gxlcms > PHP教程 > 读《深入php面向对象、模式与实践》有感(三)

读《深入php面向对象、模式与实践》有感(三)

时间:2021-07-01 10:21:17 帮助过:7人阅读

命令模式:

第一次接触到这个命令模式的时候,感觉它很像一个简化的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();
?>

以上就介绍了读《深入php面向对象、模式与实践》有感(三),包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

人气教程排行