本篇文章是对 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 等等
来源: https://www.php1.cn/detail/php-bdfac4f7b4.html