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

 更新时间:2023年12月18日 11:11:44   作者:菜皮日记  
这篇文章主要为大家介绍了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责任链行为型设计模式的资料请关注脚本之家其它相关文章!

相关文章

  • GoLang RabbitMQ TTL与死信队列以及延迟队列详细讲解

    GoLang RabbitMQ TTL与死信队列以及延迟队列详细讲解

    这篇文章主要介绍了GoLang RabbitMQ TTL与死信队列以及延迟队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • Golang 删除文件并递归删除空目录的操作

    Golang 删除文件并递归删除空目录的操作

    这篇文章主要介绍了Golang 删除文件并递归删除空目录的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 详解Go中Set的实现方式

    详解Go中Set的实现方式

    这篇文章主要介绍了详解Go中Set的实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • golang使用tail实现追踪文件变更

    golang使用tail实现追踪文件变更

    这篇文章主要为大家介绍了golang如何借助 github.com/hpcloud/tail ,实现实时追踪文件变更,达到类似shell命令tail -f的效果,感兴趣的小伙伴可以了解一下
    2023-08-08
  • Golang 如何限制木马图片上传服务器的实例

    Golang 如何限制木马图片上传服务器的实例

    本文主要介绍了Golang 如何限制木马图片上传服务器的实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Go语言使用WaitGroup等待多个协程完成

    Go语言使用WaitGroup等待多个协程完成

    sync.WaitGroup是Go标准库中的一个结构体,用于等待一组goroutine执行完成,本文就来介绍一下Go语言使用WaitGroup等待多个协程完成,感兴趣的可以了解一下
    2026-02-02
  • golang生成JSON以及解析JSON

    golang生成JSON以及解析JSON

    这篇文章主要介绍了golang生成JSON以及解析JSON,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 5个可以在Golang中优化代码以提高性能的技巧分享

    5个可以在Golang中优化代码以提高性能的技巧分享

    作为一名软件工程师,确保你的代码高效且性能良好是非常重要的。本文主要和大家分享5个可以在Golang中优化代码以提高性能的技巧,希望对大家有所帮助
    2023-03-03
  • Go语言集成开发环境之VS Code安装使用

    Go语言集成开发环境之VS Code安装使用

    VS Code是微软开源的一款编辑器,插件系统十分的丰富,下面介绍如何用VS Code搭建go语言开发环境,需要的朋友可以参考下
    2021-10-10
  • Golang实现CronJob(定时任务)的方法详解

    Golang实现CronJob(定时任务)的方法详解

    这篇文章主要为大家详细介绍了Golang如何通过一个单 pod 去实现一个常驻服务,去跑定时任务(CronJob),文中的示例代码讲解详细,需要的可以参考下
    2023-04-04

最新评论