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 相关文章推荐
Ajax PHP分页演示
Jan 02 PHP
PHP在字符断点处截断文字的实现代码
Apr 21 PHP
PHP获取url的函数代码
Aug 02 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 PHP
DOM XPATH获取img src值的query
Sep 23 PHP
php生成静态页面的简单示例
Apr 17 PHP
3款值得推荐的微信开发开源框架
Oct 28 PHP
PHP 快速排序算法详解
Nov 10 PHP
Thinkphp5.0自动生成模块及目录的方法详解
Apr 17 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 PHP
postman的安装与使用方法(模拟Get和Post请求)
Aug 06 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 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获取mysql数据库中的所有表名的代码
2011/04/23 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
JavaScript 字符串乘法
2009/08/20 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
老生常谈 关于JavaScript的类的继承
2016/06/24 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
浅谈VUE单页应用首屏加载速度优化方案
2018/08/28 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
JavaScript实现表单注册、表单验证、运算符功能
2018/10/15 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
Python使用configparser库读取配置文件
2020/02/22 Python
Audible英国:有声读物,30天免费试用
2019/10/16 全球购物
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
网络信息管理员岗位职责
2014/01/05 职场文书
八年级美术教学反思
2014/02/02 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
2015年度企业工作总结
2015/05/21 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书