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
BBS(php & mysql)完整版(七)
Oct 09 PHP
php 服务器调试 Zend Debugger 的安装教程
Sep 25 PHP
PHP 数组教程 定义数组
Oct 23 PHP
php include加载文件两种方式效率比较
Aug 08 PHP
解决php使用异步调用获取数据时出现(错误c00ce56e导致此项操作无法完成)
Jul 03 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
Jan 22 PHP
PHP实现WebService的简单示例和实现步骤
Mar 27 PHP
PHP基于文件存储实现缓存的方法
Jul 20 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
Sep 23 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 PHP
php新建文件的方法实例
Sep 26 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
一个odbc连mssql分页的类
2006/10/09 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
JQuery 实现在同一页面锚点链接之间的平滑滚动
2014/10/29 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
2017/07/21 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
使用vue-router与v-if实现tab切换遇到的问题及解决方法
2018/09/07 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
windows下安装Python和pip终极图文教程
2017/03/05 Python
Python实现视频下载功能
2017/03/14 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
Python实现王者荣耀自动刷金币的完整步骤
2021/01/22 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
预备党员入党自我评价范文
2014/03/10 职场文书
授权委托书格式范文
2014/08/02 职场文书
检讨书1000字
2014/10/11 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
避暑山庄导游词
2015/02/04 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
bat批处理之字符串操作的实现
2022/03/16 Python