• PHP面向对象之命令模式


    这个模式主要由 命令类、用户请求数据类、业务逻辑类、命令类工厂类及调用类构成,各个类的作用概括如下:

    1、命令类:调用用户请求数据类和业务逻辑类;

    2、用户请求数据类:获取用户请求数据及保存后台处理后返回的结果;

    3、业务逻辑类:如以下的示例中验证用户登陆信息是否正确的功能等;

    4、命令工厂类(我自己取的名字,哈哈):生成命令类的实例,这个类第一次看的时候我觉得有点屌,当然看了几遍了还是觉得很屌 :);

    5、调用类:调用命令类,生成视图;

    直接看代码:

    //命令类
    abstract class Command {
      abstract function execute(CommandContext $context);
    }
    
    class LoginCommand extends Command{       //处理用户登陆信息的命令类
      function execute (CommandCotext $context){    //CommandCotext 是一个处理用户请求数据和后台回馈数据的类
        $manager = Registry::getAccessManager();  //原文代码中并没有具体的实现,但说明了这是一个处理用户登陆信息的业务逻辑类
        $user = $context->get('username');
        $pass = $context->get('pass');
        $user_obj = $manager->login($user,$pass);
        if(is_null($user_obj)){
          $context->setError($manager->getError);
          return false;
        }
        $context->addParam('user',$user_obj);
        return true;               //用户登陆成功返回true
      }
    }
    
    class FeedbackCommand extends Command{        //发送邮件的命令类
      function execute(CommandContext $context){
        $msgSystem = Registry::getMessageSystem();
        $email = $context->get('email');
        $msg = $context->get('msg');
        $topic = $context->get('topci');
        $result = $msgSystem->send($email,$msg,$topic);
        if(!$result){
          $context->setError($msgSystem->getError());
          return false;
        }
        return true;
      }
    }
    
    //用户请求数据类   
    class CommandContext {
      private $params = array();
      private $error = '';
    
      function __construct (){
      $this->params = $_REQUEST;
    }
    
    function addParam($key,$val){
      $this->params[$key] = $val;
    }
    
    function get($key){
      return $this->params[$key];
    }
    
    function setError($error){
      $this->error = $error;
    }
    
    function getError(){
      return $this->error;
    }
    }
    
    
    //命令类工厂,这个类根据用户请求数据中的action来生成命令类
    class CommandNotFoundException extends Exception {}
    
    class CommandFactory {
      private static $dir = 'commands';
    
      static function getCommand($action='Default'){
        if(preg_match('/w',$action)){
          throw new Exception("illegal characters in action");
        }
        $class = UCFirst(strtolower($action))."Command";
        $file = self::$dir.DIRECTORY_SEPARATOR."{$class}.php";  //DIRECTORY_SEPARATOR代表'/',这是一个命令类文件的路径
        if(!file_exists($file)){
          throw new CommandNotFoundException("could not find '$file'");
        }
        require_once($file);
        if(!class_exists($class)){
          throw new CommandNotFoundException("no '$class' class located");
        }
        $cmd = new $class();
        return $cmd;
      }
    }
    
    //调用者类,相当于一个司令部它统筹所有的资源
    class Controller{
      private $context;
      function __construct(){
        $this->context = new CommandContext();   //用户请求数据
      }
      function getContext(){
        return $this->context;
      }
    
      function process(){
        $cmd = CommandFactory::getCommand($this->context->get('action'));    //通过命令工厂类来获取命令类
        if(!$comd->execute($this->context)){                      
          //处理失败
        } else {
          //成功
          // 分发视图
        }
      }
    }
    
    // 客户端
    $controller = new Controller();
    //伪造用户请求,真实的场景中这些参数应该是通过post或get的方式获取的,貌似又废话了:)
    $context = $controller->getContext();
    $context->addParam('action','login');
    $context->addParam('username','bob');
    $context->addParam('pass','tiddles');
    $controller->process();
  • 相关阅读:
    2020.08.28【周报】
    区间合并【排序、栈】
    1042 数字0-9的数量【解题数分DP】
    asp.net数据分页方法
    纯css面板插件,自适应,多样式
    c#winform图表控件使用示例
    使用妹子UI开发的体验分享
    阿里云储存代码整理(由三卷天书整理)
    测试程序的时候用到写参数或者错误日志的几个方法,用来方便发现错误
    fineUI表格控件各属性说明
  • 原文地址:https://www.cnblogs.com/kerryw/p/6892042.html
Copyright © 2020-2023  润新知