老生常谈PHP面向对象之命令模式(必看篇)


Posted in PHP onMay 24, 2017

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

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 相关文章推荐
PHP中用header图片地址 简单隐藏图片源地址
Apr 09 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
php通过COM类调用组件的实现代码
Jan 11 PHP
smarty模板中拼接字符串的方法
Feb 14 PHP
在Yii2中使用Pjax导致Yii2内联脚本载入失败的原因分析
Mar 06 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
php获取当前url地址的方法小结
Jan 10 PHP
php实时倒计时功能实现方法详解
Feb 27 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
Jun 17 PHP
php更新cookie内容的详细方法
Sep 30 PHP
Laravel 错误提示本地化的实现
Oct 22 PHP
php文件上传原理与实现方法详解
Dec 20 PHP
php实现查询功能(数据访问)
May 23 #PHP
php批量删除操作(数据访问)
May 23 #PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 #PHP
php出租房数据管理及搜索页面
May 23 #PHP
Yii框架创建cronjob定时任务的方法分析
May 23 #PHP
php注册审核重点解析(数据访问)
May 23 #PHP
php + nginx项目中的权限详解
May 23 #PHP
You might like
php+mysql 实现身份验证代码
2010/03/24 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
PHP防范SQL注入的具体方法详解(测试通过)
2014/05/09 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
js实现三张图(文)片一起切换的banner焦点图
2015/08/25 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
Electron autoUpdater实现Windows安装包自动更新的方法
2018/12/24 Javascript
浅谈JS中几种轻松处理'this'指向方式
2019/09/16 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
[01:14]英雄,所敬略同——2018完美盛典宣传视频4K
2018/12/05 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
python实现计算倒数的方法
2015/07/11 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
一张图片能隐含千言万语之隐藏你的程序代码
2012/12/13 HTML / CSS
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
介绍下static、final、abstract区别
2015/01/30 面试题
毕业自我鉴定范文
2013/11/06 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
化学教育专业自荐信
2014/07/04 职场文书
最新离婚协议书范本
2014/08/19 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
Python 数据可视化之Matplotlib详解
2021/11/02 Python
正则表达式基础与常用验证表达式
2022/06/16 Javascript
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL