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();
时间: 2024-08-25 19:10:55

PHP面向对象之命令模式的相关文章

面向对象编程思想-命令模式

一.引言 起初餐馆吃饭都是客人和厨师直接沟通,菜谱是一样的,可是客人多了的时候,有的客人可能有急事不吃了要退单,还有的客人点很多菜需要记录类别和次序等现象,这时服务员角色的出现解决了问题.那么面对某些无法抵御变化的"紧耦合"的场景如何做程序设计呢?命令模式设计便出现了,使得"行为请求者"与"行为实现者"解耦,以便适应变化,让对象之间调用关系更加灵活.下面请看今天要学习的命令模式: 二.命令模式 定义:将一个请求封装为一个对象,从而使可用不同的请求

C#面向对象设计之——命令模式(十五)

一.前言 命令模式将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,另外对请求排队或记录请求日志,以及支持可撤销的操作. 二.结构图 三.实例代码 namespace 命令模式 { class Program { static void Main(string[] args) { //开店前的准备 Barbecuer boy = new Barbecuer(); Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); Co

【游戏设计模式】之二 实现撤消重做、回放系统的神器:命令模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52663057 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起探索游戏开发中命令模式的用法. 命令模式的成名应用是实现诸如撤消,重做,回放,时间倒流之类的功能.如果你想知道<Dota2>中的观战系统.<魔兽争霸3>中的录像系统.<守望先锋>

javascript设计模式详解之命令模式

每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某些设计模式不自觉的我们都在使用.只不过没有对应起来罢了.本文就力求以精简的语言去介绍下设计模式这个高大上的概念.相信会在看完某个设计模式之后有原来如此的感慨. 一.基本概念与使用场景: 基本概念: 将请求封装成对象,分离命令接受者和发起者之间的耦合. 命令执行之前在执行对象中传入接受者.主要目的相互

3.4 命令模式(5.2)

1. 引子 假定电视机/TV有方法open().close()和changeChannel()用于打开.关闭和切换电视频道,而遥控器/Controller对TV的操作,通常使用消息传递/方法调用表达式. package method.command; /** * @author yqj2065 * @version 0.1 */ public class Controller1{ public static void foo(){ TV tv = new TV(); tv.open(); tv.

设计模式14:Command 命令模式(行为型模式)

Command 命令模式(行为型模式) 耦合与变化 耦合是软件不能抵御变化的根本性原因.不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系. 动机(Motivation) 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合——比如对行为进行“记录.撤销/重做(undo/redo).事务”等处理,这种无法抵御变化的紧耦合是不合适的. 在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的解耦. 意

6 行为型模式之 - 命令模式

命令模式介绍:命令模式相对于其它模式来说并没有那么多的条条框框,不算是一个很"规矩"的模式,不过,就是基于这一点,命令模式相对于其它的设计模式更为灵活,我们接触比较多的命令模式无非就是菜单命令,如在操作系统中,我们点击"关机"命令,系统会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然后结束程序进程,最后调用内核命令关闭计算机等,而我闪的命令模式也与之相似.将一系列的方法调用封装,用户只需要调用一个方法执行,那么所有这些被封装的方法就会被挨个执行调用 命

PHP设计模式——命令模式

声明:本系列博客参考资料<大话设计模式>,作者程杰. 命令模式:在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,实现二者之间的松耦合.这就是命令模式. 类图: 角色分析: 抽象命令

JavaScript设计模式与开发实践---读书笔记(9) 命令模式

命令模式的用途: 命令模式是最简单和优雅的模式之一,命令模式中的命令(command)指的是一个执行某些特定事情的指令. 命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 命令模式的例子-菜单程序: <!DOCTYPE html> <html lang="en"> <head> <met