go责任链行为型设计模式Chain Of Responsibility
作者:菜皮日记
这篇文章主要为大家介绍了go行为型设计模式之责任链Chain Of Responsibility使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
简介
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
角色
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.
以上就是go责任链行为型设计模式Chain Of Responsibility的详细内容,更多关于go责任链行为型设计模式的资料请关注脚本之家其它相关文章!