在这个模式中,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 } }
/** * 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"; } } } }