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 相关文章推荐
Win2000+Apache+MySql+PHP4+PERL安装使用小结
Oct 09 PHP
php 中include()与require()的对比
Oct 09 PHP
php Http_Template_IT类库进行模板替换
Mar 19 PHP
PHP 字符截取 解决中文的截取问题,不用mb系列
Sep 29 PHP
php字符串截取的简单方法
Jul 04 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
php常用数学函数汇总
Nov 21 PHP
Yii中使用PHPExcel导出Excel的方法
Dec 26 PHP
PHP实现微信网页授权开发教程
Jan 19 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
Sep 27 PHP
详解php语言最牛掰的Laravel框架
Nov 20 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
深入浅析Yii admin的权限控制
2016/08/31 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
JavaScript基于自定义函数判断变量类型的实现方法
2016/11/23 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
elementUI Tree 树形控件的官方使用文档
2019/04/25 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
用Python的Tornado框架结合memcached页面改善博客性能
2015/04/24 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
django输出html内容的实例
2018/05/27 Python
详解TensorFlow查看ckpt中变量的几种方法
2018/06/19 Python
python 魔法函数实例及解析
2019/09/25 Python
基于python实现把图片转换成素描
2019/11/13 Python
Django框架中间件定义与使用方法案例分析
2019/11/28 Python
Python中logging日志库实例详解
2020/02/19 Python
五分钟学会怎么用python做一个简单的贪吃蛇
2021/01/12 Python
css3绘制天猫logo实现代码
2012/11/06 HTML / CSS
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
环境工程毕业生自荐信
2013/11/17 职场文书
美术教师自我鉴定
2014/02/12 职场文书
创先争优一句话承诺
2014/05/29 职场文书
市场营销策划方案
2014/06/11 职场文书
传播学专业毕业生自荐书
2014/07/01 职场文书
手术室消毒隔离制度
2015/08/05 职场文书
2016大一新生军训感言
2015/12/08 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
担保书范文
2019/07/09 职场文书
python如何在word中存储本地图片
2021/04/07 Python
python ansible自动化运维工具执行流程
2021/06/24 Python
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技