go责任链行为型设计模式Chain Of Responsibility
目录
- 简介
- 角色
- 类图
- 代码
简介
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
角色
Handler 接口
定义处理方法签名,设置nextHandler方法
Concrete Handler 具体类
实现各自handler逻辑
- BaseHandler 封装一层handler,可有可无
类图
如图,在 client 中,将 handler 一个个javascript串起来,每个 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 SquirrelHanjsdler extends AbstractHandler { public function handle(string $request)js: 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'l编程客栈l 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($monkeyjavascript); 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 > DogClient: 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责任链行为型设计模式的资料请关注编程客栈(www.devze.com)其它相关文章!
精彩评论