老生常谈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&MYSQL分页原理及实现
Jan 02 PHP
php数组应用之比较两个时间的相减排序
Aug 18 PHP
php cout<<的一点看法
Jan 24 PHP
简单的php写入数据库类代码分享
Jul 26 PHP
基于MySQL到MongoDB简易对照表的详解
Jun 03 PHP
php文字水印和php图片水印实现代码(二种加水印方法)
Dec 25 PHP
国产PHP开发框架myqee新手快速入门教程
Jul 14 PHP
php生成shtml类用法实例
Dec 09 PHP
php将access数据库转换到mysql数据库的方法
Dec 24 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 PHP
Zend Framework连接Mysql数据库实例分析
Mar 19 PHP
PHP插件PHPMailer发送邮件功能
Feb 28 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 获取文件权限函数介绍
2013/07/11 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
PHP 验证登陆类分享
2015/03/13 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
2011/05/09 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
JavaScript中的DSL元编程介绍
2015/03/15 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
Django中URLconf和include()的协同工作方法
2015/07/20 Python
python调用java的jar包方法
2018/12/15 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
某公司.Net方向面试题
2014/04/24 面试题
创建市级文明单位实施方案
2014/03/01 职场文书
青奥会口号
2014/06/12 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
保护动物的宣传语
2015/07/13 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis