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 相关文章推荐
用文本作数据处理
Oct 09 PHP
PHP脚本的10个技巧(2)
Oct 09 PHP
php 图像函数大举例(非原创)
Jun 20 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
用PHP来计算某个目录大小的方法
Apr 01 PHP
php计算税后工资的方法
Jul 28 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
利用PHP绘图函数实现简单验证码功能的方法
Oct 18 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
php支付宝系列之电脑网站支付
May 30 PHP
PHP使用Http Post请求发送Json对象数据代码解析
Jul 16 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 ss7.5的数据调用 (笔记)
2010/03/08 PHP
PHP抽象类 介绍
2012/06/13 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
Javascript 学习笔记之 对象篇(二) : 原型对象
2014/06/24 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
vue+springboot图片上传和显示的示例代码
2020/02/14 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
2020/04/03 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
Python中的XML库4Suite Server的介绍
2015/04/14 Python
在Python中使用模块的教程
2015/04/27 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
Python安装pycurl失败的解决方法
2018/10/15 Python
python中时间转换datetime和pd.to_datetime详析
2019/08/11 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
营业经理岗位职责
2013/11/10 职场文书
小学生作文评语
2014/04/18 职场文书
活动总结格式范文
2014/04/26 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
研究生导师评语
2014/12/31 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
创业计划书之家政服务
2019/09/18 职场文书
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫