首页 > 解决方案 > 责任链实施

问题描述

我已经在 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)。我需要这是动态的,因为它们将从数据库中读取。

标签: phpchain-of-responsibility

解决方案


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

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

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

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


推荐阅读