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 相关文章推荐
dede全站URL静态化改造[070414更正]
Apr 17 PHP
php的urlencode()URL编码函数浅析
Aug 09 PHP
php中HTTP_REFERER函数用法实例
Nov 21 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
PHP设计模式之观察者模式实例
Feb 22 PHP
WordPress过滤垃圾评论的几种主要方法小结
Jul 11 PHP
CodeIgniter框架常见用法工作总结
Mar 16 PHP
[原创]PHP实现SQL语句格式化功能的方法
Jul 28 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
Feb 14 PHP
PHP实现获取毫秒时间戳的方法【使用microtime()函数】
Mar 01 PHP
php封装的pdo数据库操作工具类与用法示例
May 08 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数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
CI框架常用函数封装实例
2016/11/21 PHP
PHP pthreads v3下同步处理synchronized用法示例
2020/02/21 PHP
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
js仿支付宝填写支付密码效果实现多方框输入密码
2016/03/09 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
不同js异步函数同步的实现方法
2016/05/28 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
angularjs select 赋值 ng-options配置方法
2018/02/28 Javascript
浅析vue-cli3配置webpack-bundle-analyzer插件【推荐】
2019/10/23 Javascript
python3音乐播放器简单实现代码
2020/04/20 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
css3实现顶部社会化分享按钮示例
2014/05/06 HTML / CSS
html5 button autofocus 属性介绍及应用
2013/01/04 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
荷兰照明、灯具和配件网上商店:dmlights
2019/08/25 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
最新大学职业规划书范文
2013/12/30 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
全陪导游词开场白
2015/05/29 职场文书
初中语文教学研修日志
2015/11/13 职场文书