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中改变图片的尺寸大小的代码
Jul 17 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
php获取新浪微博数据API实例
Nov 12 PHP
php表单请求获得数据求和示例
May 15 PHP
浅析Yii2 gridview实现批量删除教程
Apr 22 PHP
php图片添加水印例子
Jul 20 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 PHP
PHP PDOStatement::rowCount讲解
Feb 01 PHP
PHP unset函数原理及使用方法解析
Aug 14 PHP
Laravel的加密解密与哈希实例讲解
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
如何利用php+mysql保存和输出文件
2006/10/09 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
中文字符串截取的js函数代码
2013/04/17 Javascript
JavaScript中的公有、私有、特权和静态成员用法分析
2014/11/20 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
node实现定时发送邮件的示例代码
2017/08/26 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
vue结合element-ui使用示例
2019/01/24 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
用jQuery实现抽奖程序
2020/04/12 jQuery
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
使用Python开发windows GUI程序入门实例
2014/10/23 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
回调函数的意义以及python实现实例
2017/06/20 Python
浅谈Django REST Framework限速
2017/12/12 Python
Python3中的列表生成式、生成器与迭代器实例详解
2018/06/11 Python
python字典的遍历3种方法详解
2019/08/10 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
pytorch 实现模型不同层设置不同的学习率方式
2020/01/06 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
python unichr函数知识点总结
2020/12/16 Python
高级销售员求职信
2013/10/25 职场文书
车间主任岗位职责
2014/03/16 职场文书
团拜会策划方案
2014/06/07 职场文书
工作检讨书大全
2015/01/26 职场文书
成事在人观后感
2015/06/16 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
使用feign服务调用添加Header参数
2021/06/23 Java/Android
JavaScript实现两个数组的交集
2022/03/25 Javascript