PHP设计模式 之 命令链模式
命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。清单 5 显示了此模式的一个示例。
清单 5. Chain.php
<?php
interface ICommand
{
function onCommand($name, $args);
}
class CommandChain
{
private $_commands = array();
public function addCommand($cmd)
{
$this->_commands[] = $cmd;
}
public function runCommand($name, $args)
{
foreach ($this->_commands as $cmd) {
if ($cmd->onCommand($name, $args))
return;
}
}
}
class UserCommand implements ICommand
{
public function onCommand($name, $args)
{
if ($name != 'addUser') return false;
echo ("UserCommand handling 'addUser'\n");
return true;
}
}
class MailCommand implements ICommand
{
public function onCommand($name, $args)
{
if ($name != 'mail') return false;
echo ("MailCommand handling 'mail'\n");
return true;
}
}
$cc = new CommandChain();
$cc->addCommand(new UserCommand());
$cc->addCommand(new MailCommand());
$cc->runCommand('addUser', null);
$cc->runCommand('mail', null);
此代码定义维护 ICommand 对象列表的 CommandChain 类。两个类都可以实现 ICommand 接口 —— 一个对邮件的请求作出响应,另一个对添加用户作出响应。 图 5 给出了 UML。
图 5. 命令链及其相关命令
如果您运行包含某些测试代码的脚本,则会得到以下输出:
% php chain.php
UserCommand handling 'addUser'
MailCommand handling 'mail'
%
代码首先创建 CommandChain 对象,并为它添加两个命令对象的实例。然后运行两个命令以查看谁对这些命令作出了响应。如果命令的名称匹配 UserCommand 或 MailCommand,则代码失败,不发生任何操作。
为处理请求而创建可扩展的架构时,命令链模式很有价值,使用它可以解决许多问题。
猜你喜欢
PHP设计模式 之 单元素模式
阅读 2852您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。单元素模式可以满足此要求。
PHP设计模式 之 观察者模式
阅读 3194观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。
PHP设计模式 之 策略模式
阅读 2941在策略模式中,算法是从复杂类提取的,因而可以方便地替换。
PHP设计模式 之 工厂模式
阅读 3375工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。