简介
使多个对象都有机会解决申请,从而防止申请的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该申请,直到有一个对象解决它为止。
角色
-
Handler 接口
定义解决办法签名,设置 nextHandler 办法
-
Concrete Handler 具体类
实现各自 handler 逻辑
- BaseHandler 封装一层 handler,可有可无
类图
如图,在 client 中,将 handler 一个个串起来,每个 handler 解决完后可决定是否向后传递。
代码
interface Handler
{public function setNext(Handler $handler): Handler;
public function handle(string $request): string;
}
abstract class AbstractHandler implements Handler
{
private $nextHandler;
public function setNext(Handler $handler): Handler
{
$this->nextHandler = $handler;
return $handler;
}
public function handle(string $request): string
{if ($this->nextHandler) {return $this->nextHandler->handle($request);
}
return "";
}
}
class MonkeyHandler extends AbstractHandler
{public function handle(string $request): string
{if ($request === "Banana") {return "Monkey: I'll eat the ". $request .".\n";} else {return parent::handle($request);
}
}
}
class SquirrelHandler extends AbstractHandler
{public function handle(string $request): string
{if ($request === "Nut") {return "Squirrel: I'll eat the ". $request .".\n";} else {return parent::handle($request);
}
}
}
class DogHandler extends AbstractHandler
{public function handle(string $request): string
{if ($request === "MeatBall") {return "Dog: I'll eat the ". $request .".\n";} else {return parent::handle($request);
}
}
}
function clientCode(Handler $handler)
{foreach (["Nut", "Banana", "Cup of coffee"] as $food) {
echo "Client: Who wants a" . $food . "?\n";
$result = $handler->handle($food);
if ($result) {echo " " . $result;} else {echo "" . $food ." was left untouched.\n";}
}
}
$monkey = new MonkeyHandler();
$squirrel = new SquirrelHandler();
$dog = new DogHandler();
$monkey->setNext($squirrel)->setNext($dog);
echo "Chain: Monkey > Squirrel > Dog\n\n";
clientCode($monkey);
echo "\nSubchain: Squirrel > Dog\n\n";
clientCode($squirrel);
output:
Chain: Monkey > Squirrel > Dog
Client: Who wants a Nut?
Squirrel: I'll eat the Nut.
Client: Who wants a Banana?
Monkey: I'll eat the Banana.
Client: Who wants a Cup of coffee?
Cup of coffee was left untouched.
Subchain: Squirrel > Dog
Client: Who wants a Nut?
Squirrel: I'll eat the Nut.
Client: Who wants a Banana?
Banana was left untouched.
Client: Who wants a Cup of coffee?
Cup of coffee was left untouched.
本文由 mdnice 多平台公布