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();

PHP面向对象处理请求,PHP面向对象之命令模式相关推荐

  1. 请求发送者与接收者解耦——命令模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/8796736 装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关 ...

  2. 围观设计模式(23)--行为型之命令模式(Command Pattern)

    在面向对象程式设计的范畴中,命令模式是一种设计模式,它尝试以物件来代表实际行动.命令物件可以把行动(action) 及其参数封装起来,于是这些行动可以被: 重复多次 取消(如果该物件有实作的话) 取消 ...

  3. 23种设计模式-命令模式《三国大阅兵》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 在面向对象程式设计的范畴中,命令模式(Command Pattern)是一 ...

  4. 设计模式之美——行为型3:迭代模式、访问者模式、命令模式、解释器模式、中介模式

    迭代器模式 迭代器模式的原理和实现 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern). 迭代器模式.它用来遍历集合对象.这里说 ...

  5. 16、设计模式-行为型模式-命令模式

    命令模式(请求发送者与接收者解耦) 在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并 不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种 ...

  6. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  7. 【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.命令模式简介 二.命令模式 适用场景 三.命令模式 优缺点 四.命令模式 与 备忘录模式 五.命令模式 代码示例 1.命令接口 2.发布命令类 3.关闭命令类 4.游戏类 5.命令执行者 ...

  8. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  9. 『设计模式』再谈麦当劳的点单模式--命令模式(Command)

    23种设计模式+额外常用设计模式汇总 (持续更新) 麦当劳,我三期设计模式拿你举例子了,私信联系我打钱!!! 概述 命令模式又称为行动(Action) 模式或交易(Transaction) 模式. 命 ...

最新文章

  1. 《庆余年》值得一看吗?Python告诉你谁在关注 | CSDN原力计划
  2. python使用正则表达式去除句子中的重复词
  3. javascript 设计模式_开发者都应该了解的7种JavaScript设计模式
  4. uni-app第三方登陆-微信
  5. 在CentOs7上yum安装redis
  6. python中split拆分数组_Python 数组分割
  7. 猜数字小c语言游戏课程任务书,C语言课程设计猜数字游戏姚成.doc
  8. 基于 Python 与 mxget 的音乐下载器
  9. 计算机网络网线颜色,网络线接法-各种网线的分类和区别-电气资讯 - 电工屋
  10. Photoshop - CMYK 和 RGB 区别是什么?
  11. w10打开网络计算机退出,Win10网络发现已关闭怎么办?|Win10启用网络发现方法
  12. 2022.01.24翻译Lorry
  13. Xpath爬取豆瓣top250电影
  14. 网络期刊(个人使用)
  15. 钉钉创建单人群、双人群及钉钉自定义机器人的初步使用(附python3代码)
  16. Stratum mining protocol
  17. Fedora 17正式版 亮点抢先体验
  18. ElasticSearch DSL语言高级查询+SpringBoot
  19. 中华人民共和国刑事诉讼法
  20. 六级(2020/12-1) Text1

热门文章

  1. web ftp java代码_java web ftp cli
  2. 使用 Docker 打造超溜的前端环境
  3. 国产数据库产业百花齐放 “1+4+4+N”格局形成
  4. 预见——数据技术的未来生态
  5. “我想再当一次 CEO,所以我离开了 IBM。”
  6. “开源社区运营就像种菜”,黄东旭谈开源商业化 | 独家
  7. Linux 基金会执行董事 Jim Zemlin:全球 Linux 的发展和生态
  8. 全面开放运营3个月,百度揭秘Apollo最新技术创新
  9. 甲骨文重磅发布:客户现可将自治数据库部署在自己的数据中心
  10. 联合国启动有史以来最大规模全球对话,腾讯会议、企业微信全程支持