老生常谈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出错界面
Oct 09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
UCenter Home二次开发指南
May 28 PHP
七款最流行的PHP本地服务器分享
Feb 19 PHP
zf框架的数据库追踪器使用示例
Mar 13 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
php检查字符串中是否包含7位GSM字符的方法
Mar 17 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
PHP的时间戳与具体时间转化的简单实现
Jun 13 PHP
Laravel统计一段时间间隔的数据方法
Oct 09 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 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对文件夹递归执行chmod命令的方法
2015/06/19 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
javascript 常用方法总结
2009/06/03 Javascript
jQuery 常见学习网站与参考书
2009/11/09 Javascript
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
小米公司JavaScript面试题
2014/12/29 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
[01:16]2014DOTA2 TI专访C9战队EE:中国五强中会占三席
2014/07/10 DOTA
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
Python  连接字符串(join %)
2008/09/06 Python
Python文件去除注释的方法
2015/05/25 Python
Linux 发邮件磁盘空间监控(python)
2016/04/23 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
Python标准库之collections包的使用教程
2017/04/27 Python
python模拟表单提交登录图书馆
2018/04/27 Python
python 通过麦克风录音 生成wav文件的方法
2019/01/09 Python
TensorFlow获取加载模型中的全部张量名称代码
2020/02/11 Python
Pytorch中.new()的作用详解
2020/02/18 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
幼儿园教学管理制度
2014/02/04 职场文书
四群教育工作实施方案
2014/03/26 职场文书
采购意向书范本
2014/03/31 职场文书
北京申奥口号
2014/06/19 职场文书
个人租房协议书(范本)
2014/10/14 职场文书
运动会新闻稿
2015/07/17 职场文书
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
Windows server 2012 NTP时间同步的实现
2022/06/25 Servers