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 相关文章推荐
mysql 全文搜索 技巧
Apr 27 PHP
PHP编程过程中需要了解的this,self,parent的区别
Dec 30 PHP
php设计模式 Template (模板模式)
Jun 26 PHP
php 深入理解strtotime函数的使用详解
May 23 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 PHP
PHP、Java des加密解密实例
Apr 27 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
合格的PHP程序员必备技能
Nov 13 PHP
Yii框架批量插入数据扩展类的简单实现方法
May 23 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 PHP
PHP使用Redis队列执行定时任务实例讲解
Mar 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
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php 实现301重定向跳转实例代码
2016/07/18 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
javascript prototype 原型链
2009/03/12 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
VUE页面中加载外部HTML的示例代码
2017/09/20 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
js操作二进制数据方法
2018/03/03 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
2020/06/19 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
python进阶教程之循环对象
2014/08/30 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
2018/02/08 Python
Python删除n行后的其他行方法
2019/01/28 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
Python递归函数特点及原理解析
2020/03/04 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
Helly Hansen工作服美国官方网上商店:为最恶劣的环境
2019/09/04 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
自荐信包含哪些内容
2013/10/30 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
比赛口号大全
2014/06/10 职场文书