老生常谈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中读取和写入WORD文档的代码
Apr 09 PHP
令PHP初学者头疼十四条问题大总结
Nov 12 PHP
在PHP中使用curl_init函数的说明
Nov 02 PHP
PHP json_decode函数详细解析
Feb 17 PHP
php ci框架中加载css和js文件失败的解决方法
Mar 03 PHP
php数组合并的二种方法
Mar 21 PHP
修改ThinkPHP缓存为Memcache的方法
Jun 25 PHP
PHP 芝麻信用接入的注意事项
Dec 01 PHP
PHP文件与目录操作示例
Dec 24 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
Oct 14 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 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
一个数据采集类
2007/02/14 PHP
PHP面向对象学习之parent::关键字
2017/01/18 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
2019/04/27 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
JS取文本框中最小值的简单实例
2013/11/29 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
NodeJS配置HTTPS服务实例分享
2017/02/19 NodeJs
vue各种事件监听实例(小结)
2020/06/24 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
在Django的视图中使用form对象的方法
2015/07/18 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
Python正则表达式完全指南
2017/05/25 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
Python自定义一个类实现字典dict功能的方法
2019/01/19 Python
python3中eval函数用法使用简介
2019/08/02 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
HTML5实现动画效果的方式汇总
2016/02/29 HTML / CSS
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
营销团队口号
2014/06/06 职场文书
横幅标语大全
2014/06/17 职场文书
单位消防安全责任书
2014/07/23 职场文书
出纳岗位职责
2015/01/31 职场文书
企业安全隐患排查治理制度
2015/08/05 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP