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责任链行为型设计模式的资料请关注脚本之家其它相关文章!

相关文章

  • go语言通过反射获取和设置结构体字段值的方法

    go语言通过反射获取和设置结构体字段值的方法

    这篇文章主要介绍了go语言通过反射获取和设置结构体字段值的方法,实例分析了Go语言反射的使用技巧,需要的朋友可以参考下
    2015-03-03
  • Go语言中关于set的实现思考分析

    Go语言中关于set的实现思考分析

    Go 开发过程中有时我们需要集合(set)这种容器,但 Go 本身未内置这种数据容器,故常常我们需要自己实现,下面我们就来看看具体有哪些实现方法吧
    2024-01-01
  • GoLang反射机制深入讲解

    GoLang反射机制深入讲解

    这篇文章主要介绍了GoLang反射机制,反射是一种让程序可以在运行时( runtime )检查其数据结构的能力,通过反射可以获取丰富的类型信息
    2022-12-12
  • Golang之模糊测试工具的使用

    Golang之模糊测试工具的使用

    本文主要介绍了Golang之模糊测试工具的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • go语言实现文件分割的方法

    go语言实现文件分割的方法

    这篇文章主要介绍了go语言实现文件分割的方法,实例分析了Go语言操作文件的技巧,需要的朋友可以参考下
    2015-03-03
  • Go语言入门13之runtime包案例讲解

    Go语言入门13之runtime包案例讲解

    这篇文章主要介绍了Go语言入门runtime包相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • GO语言入门学习之基本数据类型字符串

    GO语言入门学习之基本数据类型字符串

    字符串在Go语言中以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64 等)一样,下面这篇文章主要给大家介绍了关于GO语言入门学习之基本数据类型字符串的相关资料,需要的朋友可以参考下
    2022-04-04
  • Go 计时器使用示例全面讲解

    Go 计时器使用示例全面讲解

    这篇文章主要为大家介绍了Go 计时器使用示例全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 详解Golang中interface{}的注意事项

    详解Golang中interface{}的注意事项

    学习 golang ,对于 interface{} 接口类型,我们一定绕不过,这篇文章咱们就来一起来看看 使用 interface{} 的时候,都有哪些注意事项吧
    2023-03-03
  • 详解Go语言中接口应用模式或惯例介绍

    详解Go语言中接口应用模式或惯例介绍

    这篇文章主要为大家详细介绍了Go语言中接口应用模式或惯例介绍的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下
    2023-11-11

最新评论