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 相关文章推荐
php heredoc和phpwind的模板技术使用方法小结
Mar 28 PHP
PHP 读取文件内容代码(txt,js等)
Dec 06 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
ecshop 批量上传(加入自定义属性)
Mar 20 PHP
使用Apache的htaccess防止图片被盗链的解决方法
Apr 27 PHP
深入密码加salt原理的分析
Jun 06 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php的dl函数用法实例
Nov 06 PHP
初识laravel5
Mar 02 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
JSON字符串传到后台PHP处理问题的解决方法
Jun 05 PHP
PHP实现将base64编码字符串转换成图片示例
Jun 22 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
PHP下打开URL地址的几种方法小结
2010/05/16 PHP
php入门学习知识点七 PHP函数的基本应用
2011/07/14 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
Node.js中的http请求客户端示例(request client)
2017/05/04 Javascript
深入浅出webpack之externals的使用
2017/12/04 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
python如何调用php文件中的函数详解
2020/12/29 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
金融专业推荐信
2013/11/14 职场文书
女大学生个人求职信
2013/12/09 职场文书
高一英语教学反思
2014/01/22 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
创先争优承诺书范文
2014/03/31 职场文书
有关朝花夕拾的读书笔记
2015/06/29 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
pytest进阶教程之fixture函数详解
2021/03/29 Python
golang特有程序结构入门教程
2021/06/02 Python
Mysql 文件配置解析介绍
2022/05/06 MySQL