zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    MySQL数据库的常用命令
    函数返回 局部变量问题
    几种网络I/O模型
    socket的select模型【摘】
    Linux Bash Shell入门教程【转载】
    Shell学习【转】
    unicode 2 utf8 [转]
    linux下多线程的创建与等待详解 【转载】
    运算(93&-8)的结果
    一道腾讯的面试题,关于a和&a
  • 原文地址:https://www.cnblogs.com/kerryw/p/6892042.html
Copyright © 2011-2022 走看看