PHP面向对象处理请求,PHP面向对象之命令模式
PHP面向对象之命令模式,这个模式主要由 命令类、用户请求数据类、业务逻辑类、命令类工厂类及调用类构成,各个类的作用概括如下:
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面向对象之命令模式相关推荐
- 请求发送者与接收者解耦——命令模式
本文转载自 :http://blog.csdn.net/lovelion/article/details/8796736 装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关 ...
- 围观设计模式(23)--行为型之命令模式(Command Pattern)
在面向对象程式设计的范畴中,命令模式是一种设计模式,它尝试以物件来代表实际行动.命令物件可以把行动(action) 及其参数封装起来,于是这些行动可以被: 重复多次 取消(如果该物件有实作的话) 取消 ...
- 23种设计模式-命令模式《三国大阅兵》
对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 在面向对象程式设计的范畴中,命令模式(Command Pattern)是一 ...
- 设计模式之美——行为型3:迭代模式、访问者模式、命令模式、解释器模式、中介模式
迭代器模式 迭代器模式的原理和实现 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern). 迭代器模式.它用来遍历集合对象.这里说 ...
- 16、设计模式-行为型模式-命令模式
命令模式(请求发送者与接收者解耦) 在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并 不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种 ...
- 【白话设计模式八】命令模式(Command)
为什么80%的码农都做不了架构师?>>> #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...
- 【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.命令模式简介 二.命令模式 适用场景 三.命令模式 优缺点 四.命令模式 与 备忘录模式 五.命令模式 代码示例 1.命令接口 2.发布命令类 3.关闭命令类 4.游戏类 5.命令执行者 ...
- IOS设计模式之四(备忘录模式,命令模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- 『设计模式』再谈麦当劳的点单模式--命令模式(Command)
23种设计模式+额外常用设计模式汇总 (持续更新) 麦当劳,我三期设计模式拿你举例子了,私信联系我打钱!!! 概述 命令模式又称为行动(Action) 模式或交易(Transaction) 模式. 命 ...
最新文章
- 《庆余年》值得一看吗?Python告诉你谁在关注 | CSDN原力计划
- python使用正则表达式去除句子中的重复词
- javascript 设计模式_开发者都应该了解的7种JavaScript设计模式
- uni-app第三方登陆-微信
- 在CentOs7上yum安装redis
- python中split拆分数组_Python 数组分割
- 猜数字小c语言游戏课程任务书,C语言课程设计猜数字游戏姚成.doc
- 基于 Python 与 mxget 的音乐下载器
- 计算机网络网线颜色,网络线接法-各种网线的分类和区别-电气资讯 - 电工屋
- Photoshop - CMYK 和 RGB 区别是什么?
- w10打开网络计算机退出,Win10网络发现已关闭怎么办?|Win10启用网络发现方法
- 2022.01.24翻译Lorry
- Xpath爬取豆瓣top250电影
- 网络期刊(个人使用)
- 钉钉创建单人群、双人群及钉钉自定义机器人的初步使用(附python3代码)
- Stratum mining protocol
- Fedora 17正式版 亮点抢先体验
- ElasticSearch DSL语言高级查询+SpringBoot
- 中华人民共和国刑事诉讼法
- 六级(2020/12-1) Text1
热门文章
- web ftp java代码_java web ftp cli
- 使用 Docker 打造超溜的前端环境
- 国产数据库产业百花齐放 “1+4+4+N”格局形成
- 预见——数据技术的未来生态
- “我想再当一次 CEO,所以我离开了 IBM。”
- “开源社区运营就像种菜”,黄东旭谈开源商业化 | 独家
- Linux 基金会执行董事 Jim Zemlin:全球 Linux 的发展和生态
- 全面开放运营3个月,百度揭秘Apollo最新技术创新
- 甲骨文重磅发布:客户现可将自治数据库部署在自己的数据中心
- 联合国启动有史以来最大规模全球对话,腾讯会议、企业微信全程支持