PHP设计模式之命令模式的深入解析

 更新时间:2013年06月13日 15:35:24   作者:  
本篇文章是对PHP设计模式中的命令模式进行了详细的分析介绍,需要的朋友参考下

命令模式(Command),命令模式是封装一个通用操作的机制。

如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。

例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。

注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。



在这个模式中,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将回调函数作用到给定数组单元的方法,是十分重要的一种应用,需要的朋友可以参考下
    2014-08-08
  • 一道关于php变量引用的面试题

    一道关于php变量引用的面试题

    当一个变量等于另一个变量的引用的时候,这时任何一方改变了其值,另一方看到的这个值也会变化的。前加本次就表现出来,而后加下一次才会表现出来。
    2010-08-08
  • PHP正则匹配操作简单示例【preg_match_all应用】

    PHP正则匹配操作简单示例【preg_match_all应用】

    这篇文章主要介绍了PHP正则匹配操作,结合简单实例形式分析了php中preg_match_all针对HTML标签中P元素及img src元素内容的获取技巧,需要的朋友可以参考下
    2017-07-07
  • php中try catch捕获异常实例详解

    php中try catch捕获异常实例详解

    这篇文章主要介绍了php中try catch捕获异常的用法,以实例形式详细分析了捕获一个异常与捕获多个异常的方法,有助于更好的处理一些不必要的错误,具有一定的实用价值,需要的朋友可以参考下
    2014-11-11
  • PHP数据过滤的方法

    PHP数据过滤的方法

    关于如何确保数据过滤无法被绕过有各种各样的观点,今天我们就来看看PHP的数据过滤,对你一定会有帮助的。
    2013-10-10
  • PHP 数组操作详解【遍历、指针、函数等】

    PHP 数组操作详解【遍历、指针、函数等】

    这篇文章主要介绍了PHP 数组操作,结合实例形式详细分析了PHP数组遍历、指针、数组常用函数等相关原理、使用技巧与操作注意事项,需要的朋友可以参考下
    2020-05-05
  • php preg_replace替换实例讲解

    php preg_replace替换实例讲解

    php preg_replace()替换实例讲解,php preg_replace()是执行一个正则表达式的搜索和替换的用函数.
    2013-11-11
  • PHP安装BCMath扩展的方法

    PHP安装BCMath扩展的方法

    今天小编就为大家分享一篇关于PHP安装BCMath扩展的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • php检查是否是ajax请求的方法

    php检查是否是ajax请求的方法

    这篇文章主要介绍了php检查是否是ajax请求的方法,涉及预定义服务器变量的使用技巧,非常简单实用,需要的朋友可以参考下
    2015-04-04
  • PHP 调试工具Debug Tools

    PHP 调试工具Debug Tools

    发现了个调试PHP源码的好同志: PHP DEBUG TOOLS,需要的朋友可以参考下。
    2011-04-04

最新评论