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为什么选mysql作为数据库? Mysql 创建用户方法
Jul 02 PHP
用PHP调用Oracle存储过程的方法
Sep 12 PHP
解析在PHP中使用全局变量的几种方法
Jun 24 PHP
php生成excel列序号代码实例
Dec 24 PHP
PHP CURL获取返回值的方法
May 04 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
ThinkPHP中I(),U(),$this->post()等函数用法
Nov 22 PHP
yii数据库的查询方法
Dec 28 PHP
Yii开启片段缓存的方法
Mar 28 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
PHP多进程通信-消息队列使用
Mar 08 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批量生成缩略图的代码
2008/07/19 PHP
Linux下手动编译安装PHP扩展的例子分享
2014/07/15 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
JS中==与===操作符的比较
2009/03/21 Javascript
javascript 客户端验证上传图片的大小(兼容IE和火狐)
2009/08/15 Javascript
JavaScript/Js脚本处理html元素的自定义属性解析(亲测兼容Firefox与IE)
2013/11/25 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
Bootstrap基本样式学习笔记之表单(3)
2016/12/07 Javascript
Angular2.js实现表单验证详解
2017/06/23 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
小程序点击图片实现png转jpg
2019/10/22 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
python实现进程间通信简单实例
2014/07/23 Python
python3下实现搜狗AI API的代码示例
2018/04/10 Python
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
浅析python标准库中的glob
2020/03/13 Python
Python 实现键盘鼠标按键模拟
2020/11/18 Python
数据库面试要点基本概念
2013/10/31 面试题
人事主管岗位职责范本
2013/12/04 职场文书
大学生创业计划书的用途
2014/01/08 职场文书
网络宣传方案
2014/03/15 职场文书
创先争优标语
2014/06/27 职场文书
故宫英文导游词
2015/01/31 职场文书
工作后的感想
2015/08/07 职场文书
七年级生物教学反思
2016/02/20 职场文书
Python OpenCV实现图形检测示例详解
2022/04/08 Python