老生常谈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经典的给图片加水印程序
Dec 06 PHP
php strcmp使用说明
Apr 22 PHP
yii框架中的Url生产问题小结
Jan 16 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
Oct 04 PHP
php实现的漂亮分页方法
Apr 17 PHP
PHP实现的多彩标签效果代码分享
Aug 21 PHP
php+mysqli使用面向对象方式查询数据库实例
Jan 29 PHP
Laravel中使用阿里云OSS Composer包分享
Feb 10 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 PHP
php set_include_path函数设置 include_path 配置选项
Oct 30 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 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
抓取YAHOO股票报价的类
2009/05/15 PHP
有关PHP中MVC的开发经验分享
2012/05/17 PHP
PHP引用符&的用法详细解析
2013/08/22 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
解密效果
2006/06/23 Javascript
JavaScript入门教程(2) JS基础知识
2009/01/31 Javascript
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
基于JavaScript实现快速转换文本语言(繁体中文和简体中文)
2016/03/07 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
2016/06/14 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
使用pandas库对csv文件进行筛选保存
2020/05/25 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
TUMI澳大利亚网站:美国旅行箱包品牌
2017/03/27 全球购物
个人简历自荐信
2013/12/05 职场文书
实习鉴定范文
2013/12/19 职场文书
汉语言文学毕业生自荐信范文
2014/03/24 职场文书
大学计划书范文800字
2014/08/14 职场文书
玩手机检讨书1000字
2014/10/20 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
查看nginx配置文件路径和资源文件路径的方法
2021/03/31 Servers
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript