老生常谈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 相关文章推荐
Oracle Faq(Oracle的版本)
Oct 09 PHP
php类
Nov 27 PHP
Php Image Resize图片大小调整的函数代码
Jan 17 PHP
php设计模式  Command(命令模式)
Jun 17 PHP
ThinkPHP调试模式与日志记录概述
Aug 22 PHP
php获取根域名方法汇总
Oct 28 PHP
PHP flush 函数使用注意事项
Aug 26 PHP
php 生成签名及验证签名详解
Oct 26 PHP
PHP学习记录之数组函数
Jun 01 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 PHP
Laravel框架实现抢红包功能示例
Oct 31 PHP
PHP的new static和new self的区别与使用
Nov 27 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/11/12 PHP
分享10段PHP常用代码
2015/11/11 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
关于query Javascript CSS Selector engine
2013/04/12 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
轻松创建nodejs服务器(9):实现非阻塞操作
2014/12/18 NodeJs
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
node中Express 动态设置端口的方法
2017/08/04 Javascript
Python算法之栈(stack)的实现
2014/08/18 Python
Python爬虫框架Scrapy实战之批量抓取招聘信息
2015/08/07 Python
Python中数字以及算数运算符的相关使用
2015/10/12 Python
Python Json序列化与反序列化的示例
2018/01/31 Python
Django数据库表反向生成实例解析
2018/02/06 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
Python数学形态学实例分析
2019/09/06 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
2020/02/17 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
python selenium 获取接口数据的实现
2020/12/07 Python
体育教师工作总结的自我评价
2013/10/10 职场文书
工程造价与管理专业应届生求职信
2013/11/23 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
幼儿园家长会邀请函
2014/01/15 职场文书
平面设计专业求职信
2014/08/09 职场文书
踏青活动策划方案
2014/08/19 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
2014年安全生产工作总结
2014/11/13 职场文书
店面出租协议书范本
2014/11/28 职场文书
小学优秀教师事迹材料
2014/12/16 职场文书
小学推普周活动总结
2015/05/07 职场文书
2015年电教工作总结
2015/05/26 职场文书
订货会主持词
2015/07/01 职场文书
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers