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时间不正确的解决方法
Apr 09 PHP
一道求$b相对于$a的相对路径的php代码
Aug 08 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
Oct 27 PHP
php去除换行符的方法小结(PHP_EOL变量的使用)
Feb 16 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
ThinkPHP中的关联模型注意点
Jun 16 PHP
php结合web uploader插件实现分片上传文件
May 10 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
Oct 18 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
php如何比较两个浮点数是否相等详解
Feb 12 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无限分类的类
2007/01/02 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
2013/06/08 PHP
phpmailer绑定邮箱的实现方法
2016/12/01 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
2013/12/22 Javascript
jquery基础教程之数组使用详解
2014/03/10 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
纯js实现手风琴效果
2020/04/17 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
javascript设计模式 ? 观察者模式原理与用法实例分析
2020/04/22 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
在python中安装basemap的教程
2018/09/20 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
学校感恩教育活动总结
2014/07/07 职场文书
书法社团活动总结
2015/05/07 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server
CSS list-style-type属性使用方法
2023/05/21 HTML / CSS