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 相关文章推荐
TMDPHP 模板引擎使用教程
Mar 13 PHP
php对mongodb的扩展(初出茅庐)
Nov 11 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
Apr 24 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
Linux中为php配置伪静态
Dec 17 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
Docker配置PHP开发环境教程
Dec 21 PHP
thinkPHP分页功能实例详解
May 05 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
Aug 02 PHP
解决laravel(5.5)访问public报错的问题
Oct 12 PHP
php查看一个变量的占用内存的实例代码
Mar 29 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
基于PHP文件操作的详解
2013/06/05 PHP
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
HTML node相关的一些资料整理
2010/01/01 Javascript
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
js 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
2010/04/14 Javascript
javascript加号"+"的二义性说明
2013/03/04 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
三种动态加载js的jquery实例代码另附去除js方法
2014/04/30 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
详解A标签中href=""的几种用法
2017/08/20 Javascript
vue 1.0 结合animate.css定义动画效果
2018/07/11 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
Python之PyUnit单元测试实例
2014/10/11 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
如何使用scrapy中的ItemLoader提取数据
2020/09/30 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
Python 实现进度条的六种方式
2021/01/06 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
SQL Server数据库笔试题和答案
2016/02/04 面试题
杭州-DOTNET笔试题集
2013/09/25 面试题
教师党员承诺书2015
2015/01/21 职场文书
大学生个人学年总结
2015/02/15 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
Python借助with语句实现代码段只执行有限次
2022/03/23 Python