老生常谈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服务器实现多session并发运行
Oct 09 PHP
php面向对象全攻略 (七) 继承性
Sep 30 PHP
php高级编程-函数-郑阿奇
Jul 04 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
ajax完美实现两个网页 分页功能的实例代码
Apr 16 PHP
PHP实现对站点内容外部链接的过滤方法
Sep 10 PHP
html静态页面调用php文件的方法
Nov 13 PHP
php生成二维码时出现中文乱码的解决方法
Dec 18 PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 PHP
php生成数字字母的验证码图片
Jul 14 PHP
Yii框架组件和事件行为管理详解
May 20 PHP
php防止sql注入的方法详解
Feb 20 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
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
php 小乘法表实现代码
2009/07/16 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
php利用header函数下载各种文件
2016/08/24 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
购物车实现的几种方式优缺点对比
2018/05/02 PHP
seajs加载jquery时提示$ is not a function该怎么解决
2015/10/23 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
JavaScript中的FileReader图片预览上传功能实现代码
2017/07/24 Javascript
详解VueJS应用中管理用户权限
2018/02/02 Javascript
Python开发的实用计算器完整实例
2017/05/10 Python
Python排序算法实例代码
2017/08/10 Python
python实现数据导出到excel的示例--普通格式
2018/05/03 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
python3学生名片管理v2.0版
2018/11/29 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
高级Java程序员面试要点
2013/08/02 面试题
优秀士兵个人事迹材料
2014/01/19 职场文书
婚前财产公证书
2014/04/10 职场文书
中学生家长评语大全
2014/04/16 职场文书
卫生标语大全
2014/06/21 职场文书
小学班主任事迹材料
2014/12/17 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
2015年维修工作总结
2015/04/25 职场文书
小学教师教育随笔
2015/08/14 职场文书
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript