老生常谈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批量生成随机用户名
Jul 10 PHP
php xml文件操作代码(一)
Mar 20 PHP
PHP 学习路线与时间表
Feb 21 PHP
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
Aug 02 PHP
解析php中session的实现原理以及大网站应用应注意的问题
Jun 17 PHP
php格式化日期实例分析
Nov 12 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 PHP
php实现源代码加密的方法
Jul 11 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
WordPress中获取指定分类及其子分类下的文章数目
Dec 31 PHP
Zend Framework入门知识点小结
Mar 19 PHP
PHP ElasticSearch做搜索实例讲解
Feb 05 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生成随机密码类分享
2014/06/25 PHP
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
PHP日期和时间函数的使用示例详解
2020/08/06 PHP
JS启动应用程序的一个简单例子
2008/05/11 Javascript
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
JavaScript 面向对象与原型
2015/04/10 Javascript
js上传图片及预览功能实例分析
2015/04/24 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
利用Node.js对文件进行重命名
2017/03/12 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
简单介绍Python的Tornado框架中的协程异步实现原理
2015/04/23 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
2020/02/29 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
高清安全摄像头系统:Lorex Technology
2018/07/20 全球购物
信息专业本科生个人的自我评价
2013/10/28 职场文书
中专生毕业自我鉴定
2013/11/01 职场文书
将相和教学反思
2014/02/04 职场文书
2014和解协议书范文
2014/09/15 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
管理失职检讨书
2015/05/05 职场文书
详解MySQL集群搭建
2021/05/26 MySQL