开发者

go责任链行为型设计模式Chain Of Responsibility

开发者 https://www.devze.com 2023-12-20 10:25 出处:网络 作者: 菜皮日记
目录简介角色类图代码简介 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
目录
  • 简介
  • 角色
  • 类图
    • 代码

简介

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

角色

  • Handler 接口

    定义处理方法签名,设置nextHandler方法

  • Concrete Handler 具体类

    实现各自handler逻辑

  • BaseHandler 封装一层handler,可有可无

类图

如图,在 client 中,将 handler 一个个javascript串起来,每个 handler 处理完后可决定是否向后传递。

go责任链行为型设计模式Chain Of Responsibility

代码

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 > 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责任链行为型设计模式的资料请关注编程客栈(www.devze.com)其它相关文章!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号