当前位置:Gxlcms > PHP教程 > PHP设计模式漫谈之命令模式_PHP

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

时间:2021-07-01 10:21:17 帮助过:31人阅读

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

如果你熟悉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. * ConcreteCommand.
  17. */
  18. class MoreThanZeroValidator implements Validator
  19. {
  20. public function isValid($value)
  21. {
  22. return $value > 0;
  23. }
  24. }
  25. /**
  26. * ConcreteCommand.
  27. */
  28. class EvenValidator implements Validator
  29. {
  30. public function isValid($value)
  31. {
  32. return $value % 2 == 0;
  33. }
  34. }
  35. /**
  36. * The Invoker. An implementation could store more than one
  37. * Validator if needed.
  38. */
  39. class ArrayProcessor
  40. {
  41. protected PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式、责任链模式和结构模式;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。

    如果你熟悉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对象实现的示例:

    ___FCKpd___0

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

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

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

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

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

    rule
    ;
  42. public function __construct (Validator $rule)
  43. {
  44. $this->_rule = $rule;
  45. }
  46. public function process(array $numbers)
  47. {
  48. foreach ($numbers as $n) {
  49. if ($this->_rule->IsValid($n)) {
  50. echo $n, "\n";
  51. }
  52. }
  53. }
  54. }
  55. // Client code
  56. $processor = new ArrayProcessor(new EvenValidator());
  57. $processor->process(array(1, 20, 18, 5, 0, 31, 42));

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

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

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

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

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

人气教程排行