老生常谈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 相关文章推荐
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
Oct 15 PHP
php实现统计邮件大小的方法
Aug 06 PHP
Codeigniter注册登录代码示例
Jun 12 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
CI框架实现创建自定义类库的方法
Dec 25 PHP
浅谈php://filter的妙用
Mar 05 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
如何用Laravel包含你自己的帮助函数
May 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
《Re:从零开始的异世界生活》剧情体验,手游新作定名
2020/04/09 日漫
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
JavaScript插件化开发教程 (三)
2015/01/27 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
vue 实现把路由单独分离出来
2020/08/13 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
[04:48]DOTA2亚洲邀请赛林书豪为VGJ加油
2017/04/01 DOTA
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python集合用法实例分析
2015/05/30 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
python requests使用socks5的例子
2019/07/25 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
使用Html5 Stream开发实时监控系统
2020/06/02 HTML / CSS
自我鉴定怎么写
2014/01/12 职场文书
学生手册家长评语
2014/02/10 职场文书
趣味运动会加油词
2015/07/18 职场文书
组织委员竞选稿
2015/11/21 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS
mysql数据库如何转移到oracle
2022/12/24 MySQL