PHP设计模式之命令模式的深入解析


Posted in PHP onJune 13, 2013

命令模式(Command),命令模式是封装一个通用操作的机制。

如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。

例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。

注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。

PHP设计模式之命令模式的深入解析

在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。
参与者:
◆Command(命令):在一个方法调用之上定义一个抽象;
◆ConcreteCommand(具体的命令):一个操作的实现;
◆Invoker(调用者):引用Command实例作为它可用的操作。
下面的代码展示了Validator组件作为Command对象实现的示例:

/**  
 * The Command abstraction.  
 * In this case the implementation must return a result,  
 * sometimes it only has side effects.  
 */ 
interface Validator  
{  
    /**  
     * The method could have any parameters.  
     * @param mixed  
     * @return boolean  
     */ 
    public function isValid($value);  
}  /**  
 * ConcreteCommand.  
 */ 
class MoreThanZeroValidator implements Validator  
{  
    public function isValid($value)  
    {  
        return $value > 0;  
    }  
}  
/**  
 * ConcreteCommand.  
 */ 
class EvenValidator implements Validator  
{  
    public function isValid($value)  
    {  
        return $value % 2 == 0;  
    }  
}  
/**  
 * The Invoker. An implementation could store more than one  
 * Validator if needed.  
 */ 
class ArrayProcessor  
{  
    protected $_rule;  
    public function __construct (Validator $rule)  
    {  
        $this->_rule = $rule;  
    }  
    public function process(array $numbers)  
    {  
        foreach ($numbers as $n) {  
            if ($this->_rule->IsValid($n)) {  
                echo $n, "\n";  
            }  
        }  
    }  
}  
// Client code  
$processor = new ArrayProcessor(new EvenValidator());  
$processor->process(array(1, 20, 18, 5, 0, 31, 42));

使用PHP设计模式中的命令模式的一些注意事项:
◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;
◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;
◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;
◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。
PHP 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
PHP 多维数组排序(usort,uasort)
Jun 30 PHP
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
May 19 PHP
PHP测试程序运行时间的类
Feb 05 PHP
php获取网页标题和内容函数(不包含html标签)
Feb 03 PHP
php中使用Ajax时出现Error(c00ce56e)的详细解决方案
Nov 03 PHP
CI框架扩展系统核心类的方法分析
May 23 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
PHP+原生态ajax实现的省市联动功能详解
Aug 15 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 #PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
Jun 13 #PHP
判断php数组是否为索引数组的实现方法
Jun 13 #PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 #PHP
PHP 基于Yii框架中使用smarty模板的方法详解
Jun 13 #PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 #PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
Jun 13 #PHP
You might like
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
php后门URL的防范
2013/11/12 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
php定时执行任务设置详解
2015/02/06 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
js 页面输出值
2008/11/30 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
2016/09/20 Javascript
详谈jQuery unbind 删除绑定事件 / 移除标签方法
2017/03/02 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
Vue实现美团app的影院推荐选座功能【推荐】
2018/08/29 Javascript
Vue.js样式动态绑定实现小结
2019/01/24 Javascript
Vue 同步异步存值取值实现案例
2020/08/05 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
python判断字符串是否包含子字符串的方法
2015/03/24 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
python实现维吉尼亚加密法
2019/03/20 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
小学生考试获奖感言
2014/01/30 职场文书
租车协议书范本
2014/04/22 职场文书
保护环境倡议书500字
2014/05/19 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
2015年团队工作总结范文
2015/05/04 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
JS封装cavans多种滤镜组件
2022/02/15 Javascript
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript