PHP设计模式漫谈之命令模式

原创
开发 后端 前端
PHP的命令模式相当于程序中的回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。

【51CTO独家特稿】PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式责任链模式结构模式;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。

欲了解更多关于PHP设计模式的内容,欢迎访问:PHP设计模式漫谈

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

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

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

PHP设计模式中的命令模式 
PHP设计模式中的命令模式

在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。

参与者:

◆Command(命令):在一个方法调用之上定义一个抽象;

◆ConcreteCommand(具体的命令):一个操作的实现;

◆Invoker(调用者):引用Command实例作为它可用的操作。

下面的代码展示了Validator组件作为Command对象实现的示例:

  1. /**  
  2.  * The Command abstraction.  
  3.  * In this case the implementation must return a result,  
  4.  * sometimes it only has side effects.  
  5.  */ 
  6. interface Validator  
  7. {  
  8.     /**  
  9.      * The method could have any parameters.  
  10.      * @param mixed  
  11.      * @return boolean  
  12.      */ 
  13.     public function isValid($value);  
  14. }  
  15.  
  16. /**  
  17.  * ConcreteCommand.  
  18.  */ 
  19. class MoreThanZeroValidator implements Validator  
  20. {  
  21.     public function isValid($value)  
  22.     {  
  23.         return $value > 0;  
  24.     }  
  25. }  
  26.  
  27. /**  
  28.  * ConcreteCommand.  
  29.  */ 
  30. class EvenValidator implements Validator  
  31. {  
  32.     public function isValid($value)  
  33.     {  
  34.         return $value % 2 == 0;  
  35.     }  
  36. }  
  37.  
  38. /**  
  39.  * The Invoker. An implementation could store more than one  
  40.  * Validator if needed.  
  41.  */ 
  42. class ArrayProcessor  
  43. {  
  44.     protected $_rule;  
  45.  
  46.     public function __construct (Validator $rule)  
  47.     {  
  48.         $this->_rule = $rule;  
  49.     }  
  50.  
  51.     public function process(array $numbers)  
  52.     {  
  53.         foreach ($numbers as $n) {  
  54.             if ($this->_rule->IsValid($n)) {  
  55.                 echo $n"\n";  
  56.             }  
  57.         }  
  58.     }  
  59. }  
  60.  
  61. // Client code  
  62. $processor = new ArrayProcessor(new EvenValidator());  
  63. $processor->process(array(1, 20, 18, 5, 0, 31, 42)); 

使用PHP设计模式中的命令模式的一些注意事项:

◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;

◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;

◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;

◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

 

【编辑推荐】

  1. 让PHP开发者事半功倍的十大技巧
  2. 专家畅谈ASP.NET与PHP的未来
  3. Facebook揭秘HipHop项目 PHP程序大提速
责任编辑:佚名 来源: 51CTO.com
相关推荐

2010-04-19 09:30:00

工厂模式PHP设计模式

2010-03-25 08:52:30

PHP设计模式代理模式

2010-04-21 08:38:18

解释器模式PHP设计模式

2010-04-08 09:27:04

PHP设计模式结构模式

2010-04-01 09:10:03

PHP设计模式责任链模式

2010-04-29 08:53:11

PHP迭代器模式

2010-05-06 08:44:37

调解者模式

2011-04-21 09:46:41

设计模式

2023-05-04 08:47:31

命令模式抽象接口

2020-11-03 13:05:18

命令模式

2020-08-21 07:23:50

工厂模式设计

2012-07-10 02:01:53

设计模式命令模式

2021-06-09 08:53:34

设计模式策略模式工厂模式

2012-02-29 09:41:14

JavaScript

2023-09-04 13:14:00

装饰器设计模式

2012-01-13 15:59:07

2021-06-16 08:56:06

模版方法模式设计模式行为型设计模式

2021-06-29 08:54:23

设计模式代理模式远程代理

2021-12-24 07:50:45

责任链模式设计

2015-09-08 13:39:10

JavaScript设计模式
点赞
收藏

51CTO技术栈公众号