老生常谈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 相关文章推荐
BBS(php & mysql)完整版(一)
Oct 09 PHP
PHP中的正规表达式(二)
Oct 09 PHP
PHP+FLASH实现上传文件进度条相关文件 下载
Jul 21 PHP
PHP exif扩展方法开启详解
Jul 28 PHP
PHP文件缓存内容保存格式实例分析
Aug 20 PHP
php自动提交表单的方法(基于fsockopen与curl)
May 09 PHP
php实现xml与json之间的相互转换功能实例
Jul 07 PHP
PHP打印输出函数汇总
Aug 28 PHP
ThinkPHP 模板substr的截取字符串函数详解
Jan 09 PHP
PHP在linux上执行外部命令的方法
Feb 06 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 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的error_reporting错误级别变量对照表
2014/07/08 PHP
ThinkPHP安装和设置
2015/07/27 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
jquery实现的让超出显示范围外的导航自动固定屏幕最顶上
2011/09/22 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
H5用户注册表单页 注册模态框!
2016/09/17 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
微信小程序 下拉菜单的实现
2017/04/06 Javascript
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
Vue学习之组件用法实例详解
2020/01/06 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
斯图尔特·韦茨曼鞋加拿大官网:Stuart Weitzman加拿大
2019/10/13 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
若干个Java基础面试题
2015/05/19 面试题
年终自我鉴定
2013/10/09 职场文书
师德学习感言
2014/01/31 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
教师作风整改措施思想汇报
2014/10/12 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
如何利用React实现图片识别App
2022/02/18 Javascript