老生常谈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 相关文章推荐
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
Nov 18 PHP
php中的登陆login
Jan 18 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
实测在class的function中include的文件中非php的global全局环境
Jul 15 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
PHP抓取、分析国内视频网站的视频信息工具类
Apr 02 PHP
thinkphp实现数组分页示例
Apr 13 PHP
使用Appcan客户端自动更新PHP版本号(全)
Jul 31 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
php中数组最简单的使用方法
Dec 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
TMDPHP 模板引擎使用教程
2012/03/13 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
php中文字符串截取方法实例总结
2014/09/30 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
一波PHP中cURL库的常见用法代码示例
2016/05/06 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
js类中的公有变量和私有变量
2008/07/24 Javascript
window.name代替cookie的实现代码
2010/11/28 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
JSON取值前判断
2014/12/23 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
JS运动基础框架实例分析
2015/03/03 Javascript
JavaScript 常见安全漏洞和自动化检测技术
2015/08/21 Javascript
jquery.qtip提示信息插件用法简单实例
2016/06/17 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
webpack3之loader全解析
2017/10/26 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
使用vue根据状态添加列表数据和删除列表数据的实例
2018/09/29 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
便捷提取python导入包的属性方法
2018/10/15 Python
python删除列表元素的三种方法(remove,pop,del)
2019/07/22 Python
Python实现中值滤波去噪方式
2019/12/18 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
如何转换一个字符串到enum值
2014/04/12 面试题
C#实现启动一个进程
2016/10/01 面试题
电子信息专业自荐书
2014/02/04 职场文书
一月红领巾广播稿
2014/02/11 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
毕业生见习报告总结
2014/11/08 职场文书
公司财务部岗位职责
2015/04/14 职场文书
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL