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输出表格的实现代码(修正版)
Dec 29 PHP
php分页函数示例代码分享
Feb 24 PHP
php输出指定时间以前时间格式的方法
Mar 21 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
php将数组存储为文本文件方法汇总
Oct 28 PHP
浅谈PHP中的
Apr 23 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
php简单检测404页面的方法示例
Aug 23 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
Apr 14 PHP
PHP底层运行机制与工作原理详解
Jul 31 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实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
基于php权限分配的实现代码
2013/04/28 PHP
php变量作用域的深入解析
2013/06/03 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(八)
2014/06/23 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
javascript解决innerText浏览器兼容问题思路代码
2013/05/17 Javascript
js切换光标示例代码
2013/10/10 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
node.js 微信开发之定时获取access_token
2020/02/07 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python连接mysql数据库示例(做增删改操作)
2013/12/31 Python
Python3实现生成随机密码的方法
2014/08/23 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
python画一个玫瑰和一个爱心
2020/08/18 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
王老吉广告词
2014/03/20 职场文书
服装设计专业毕业生求职信
2014/04/09 职场文书
毕业留言寄语大全
2014/04/10 职场文书
教师遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
上班旷工检讨书
2015/08/15 职场文书