老生常谈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 相关文章推荐
MySQL授权问题总结
May 06 PHP
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
Sep 24 PHP
php从右向左/从左向右截取字符串的实现方法
Nov 28 PHP
PHP文章采集URL补全函数(FormatUrl)
Aug 02 PHP
php适配器模式介绍
Aug 14 PHP
C#使用PHP服务端的Web Service通信实例
Apr 08 PHP
php导出中文内容excel文件类实例
Jul 06 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
Dec 07 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
laravel框架中视图的基本使用方法分析
Nov 23 PHP
PHP网站常见安全漏洞,及相应防范措施总结
Mar 01 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
ASP知识讲座四
2006/10/09 PHP
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
关于document.cookie的使用javascript
2010/10/29 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
javascript求日期差的方法
2016/03/02 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
深入浅析python 中的匿名函数
2018/05/21 Python
python实现京东秒杀功能
2018/07/30 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
如何使用python代码操作git代码
2020/02/29 Python
python与js主要区别点总结
2020/09/13 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
Python文件名匹配与文件复制的实现
2020/12/11 Python
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
Raffaello Network德国:意大利拉斐尔时尚购物网
2019/05/01 全球购物
数控专业个人求职信范例
2013/11/29 职场文书
法学专业毕业生自荐信范文
2013/12/18 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
高中地理教学反思
2014/01/29 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
民主评议党员工作总结
2014/10/20 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
夫妻双方自愿离婚协议书
2014/10/24 职场文书
2014年煤矿工人工作总结
2014/12/08 职场文书
清洁工个人工作总结
2015/03/05 职场文书
走进毛泽东观后感
2015/06/04 职场文书
python pandas 解析(读取、写入)CSV 文件的操作方法
2022/12/24 Python