老生常谈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 md5下16位和32位的实现代码
Apr 09 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
Jun 12 PHP
PHP连接操作access数据库实例
Mar 30 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
php  单例模式详细介绍及实现源码
Nov 05 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
Dec 14 PHP
thinkphp框架使用JWTtoken的方法详解
Oct 10 PHP
php桥接模式应用案例分析
Oct 23 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
php语言注释,单行注释和多行注释
2018/01/21 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
jQuery带进度条全屏图片轮播特效代码分享
2020/06/28 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
浅析Jquery操作select
2016/12/13 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
nodejs密码加密中生成随机数的实例代码
2017/07/17 NodeJs
vue获取时间戳转换为日期格式代码实例
2019/04/17 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
微信小程序后端(java)开发流程的详细步骤
2019/11/13 Javascript
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
Python与shell的3种交互方式介绍
2015/04/11 Python
利用Python实现图书超期提醒
2016/08/02 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
判断python对象是否可调用的三种方式及其区别详解
2019/01/31 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
python Canny边缘检测算法的实现
2020/04/24 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
优秀团员个人的自我评价
2013/10/02 职场文书
大学生毕业自我鉴定范文
2013/11/03 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
法人授权委托书范本
2014/09/17 职场文书
公司授权委托书范本
2014/09/18 职场文书
检讨书大全
2015/01/27 职场文书