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的配置文件php.ini
Oct 09 PHP
基于php缓存的详解
May 15 PHP
fetchAll()与mysql_fetch_array()的区别详解
Jun 05 PHP
php生成图形验证码几种方法小结
Aug 15 PHP
php 批量替换程序的具体实现代码
Oct 04 PHP
php模板原理讲解
Nov 13 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
PHP计算一年多少个星期和每周的开始和结束日期
Jul 01 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 PHP
PHP后台备份MySQL数据库的源码实例
Mar 18 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 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 内存缓存加速功能memcached安装与用法
2009/09/03 PHP
php 修改zen-cart下单和付款流程以防止漏单
2010/03/08 PHP
jQuery 使用个人心得
2009/02/26 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
利用JS实现简单的日期选择插件
2017/01/23 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
使用JavaScript破解web
2018/09/28 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
详解vue-cli3 中跨域解决方案
2019/04/10 Javascript
微信小程序 wx:for遍历循环使用实例解析
2019/09/09 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
用Python编写简单的微博爬虫
2016/03/04 Python
Sanic框架流式传输操作示例
2018/07/18 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
python 5个顶级异步框架推荐
2020/09/09 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
简单介绍HTML5中的文件导入
2015/05/08 HTML / CSS
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
学生党员公开承诺书
2014/05/28 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
vue 实现上传组件
2021/05/31 Vue.js