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 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP 第二节 数据类型之转换
Apr 28 PHP
PHP中“简单工厂模式”实例代码讲解
Sep 04 PHP
PHP 万年历实现代码
Oct 18 PHP
解析php防止form重复提交的方法
Jul 01 PHP
Laravel框架学习笔记(一)环境搭建
Oct 15 PHP
10个php函数实用却不常见
Oct 13 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
Laravel中日期时间处理包Carbon的简单使用
Sep 21 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 PHP
PHP中strtr与str_replace函数运行性能简单测试示例
Jun 22 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模拟SQL Server的两个日期处理函数
2006/10/09 PHP
PHP实现的数据对象映射模式详解
2019/03/20 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
JQuery给元素绑定click事件多次执行的解决方法
2014/05/29 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
浅谈javascript中的call、apply、bind
2016/03/06 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
使用wxapp-img-loader自定义组件实现微信小程序图片预加载功能
2018/10/18 Javascript
vue的keep-alive用法技巧
2019/08/15 Javascript
浅谈Vue组件单元测试究竟测试什么
2020/02/05 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
JS实现随机点名器
2020/04/12 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
jQuery实现动态向上滚动
2020/12/21 jQuery
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
python获取网页状态码示例
2014/03/30 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
Python内置函数的用法实例教程
2014/09/08 Python
如何解决django配置settings时遇到Could not import settings 'conf.local'
2014/11/18 Python
Python多线程threading模块用法实例分析
2019/05/22 Python
python3 反射的四种基本方法解析
2019/08/26 Python
Python数据可视化:饼状图的实例讲解
2019/12/07 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
CSS3 透明色 RGBA使用介绍
2013/08/06 HTML / CSS
Fabletics官网:美国运动服饰品牌,由好莱坞女演员凯特·哈德森创立
2019/10/19 全球购物
介绍一下gcc特性
2012/01/20 面试题
企业统计员岗位职责
2013/12/13 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
cf收人广告词大全
2014/03/14 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
Nginx进程管理和重载原理详解
2021/04/22 Servers
如何有效防止sql注入的方法
2021/05/25 SQL Server