PHP设计模式之命令模式的深入解析
程序员文章站
2022-06-29 17:14:28
命令模式(command),命令模式是封装一个通用操作的机制。
如果你熟悉c或php,你可能已经遇到过command,它相当于程序中的:回调(callback)。回调通常...
命令模式(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等等。