责任链实施

Chain of Responsibility implementation

我已经在 PHP 中使用多个处理程序实施了责任链模式。正如模式所暗示的那样,我可以按如下方式链接处理程序:

$handler = new Handler();
$handler->chainNext(new HandlerOne)->chainNext(new HandlerTwo)->chainNext(new HandlerThree);
$result = $handler->handle();

我想以更具程序化的方式执行此操作,但我未能实现同样的目标。在数组中存储处理程序时,仅处理(执行)第一个和最后一个处理程序。

$handler = new Handler();
foreach ($handlers as $element) {
    $handler->chainNext(new $element);
}
$result = $handler->handle();

您对如何以编程方式进行此操作有任何建议吗?这样做的主要原因:我永远不会知道需要执行多少个处理程序 (1..n)。我需要它是动态的,因为它们将从数据库中读取。

您需要在下一个循环中使用 $element。像这样:

$handler = new Handler();
$last = $handler;
foreach ($handlers as $element) {
    $last->chainNext($element);
    $last = $element;

}
$result = $handler->handle();

代码假定 $handlers 已经包含对象实例(那么新的 $element 是错误的..)