首页 > 其他分享 >golang实现设计模式之责任链模式-优缺点,适用场景

golang实现设计模式之责任链模式-优缺点,适用场景

时间:2023-06-09 18:23:56浏览次数:49  
标签:请求 处理 handler 优缺点 next golang reqLevel Handler 设计模式

责任链模式是一种行为型的设计模式,也叫职责链,定义:在这样的场景中,请求需要经过一系列的处理者,通过列表或者链表将处理者组合起来,请求依次被处理者处理,如果需要中断,也可以及时退出处理。上述的这种的应用场景,典型的就是在 web 应用中的 中间件或者拦截器,比如 Gin框架 的中间件。

结构

  • 1.抽象处理者(Handler)角色。定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  • 2.具体处理者(Concrete Handler)角色。实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 3.客户类(Client)角色。创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

优缺点

  • 优点

1.降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
2.增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
3.增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
4.责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
5.责任分担,明确各类的责任范围,符合类的单一职责原则。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

  • 缺点

1.不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
2.对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
3.职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性。会由于职责链的错误设置而导致系统出错,如可能会造成循环调用。

适用场景

  • 1.多个对象可以处理一个请求,但具体由哪个对象处理该请求在运行时自动确定。
  • 2.可动态指定一组对象处理请求,或添加新的处理者。
  • 3.需要在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求。

代码实现

package main

import (
   "fmt"
   "strconv"
)

// chain of responsibility mode
// 1.abstract handler interface
type iHandler interface {
   Handler(handlerID int) string
}

// 2.concrete handler
type handler struct {
   name     string
   next     iHandler
   reqLevel int
}

// new
func NewHandler(name string, next iHandler, reqLevel int) *handler {
   return &handler{
      name:     name,
      next:     next,
      reqLevel: reqLevel,
   }
}

func (r *handler) Handler(reqLevel int) string {
   if r.reqLevel == reqLevel {
      return r.name + " handled " + strconv.Itoa(reqLevel)
   }

   if r.next == nil {
      return ""
   }

   return r.next.Handler(reqLevel)
}

// 3.client
func main() {
   zh := NewHandler("zhangSan", nil, 1)
   li := NewHandler("liSi", zh, 2)
   w := NewHandler("wangWu", li, 3)

   r := w.Handler(2) // 通过next依次向下传递,直到得到处理或者到最后
   fmt.Println(r)
}

参考文章:

标签:请求,处理,handler,优缺点,next,golang,reqLevel,Handler,设计模式
From: https://www.cnblogs.com/davis12/p/17469987.html

相关文章

  • golang实现设计模式之策略模式-优缺点,适用场景
    策略模式是一种行为型的设计模式,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户,或者认为把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。结构1.抽象策略(Strategy)类。定义了一个公共接口,各种不......
  • golang实现设计模式之适配器模式-优缺点,适用场景
    适配器模式是一种结构型设计模式,它是通过接口转换,使得原先接口不被兼容的其他类可以一起工作。类型类结构型特点:-程序耦合性高-要求程序员对组件内部结构熟悉-应用相对少些类适配器模式可以用过继承的方式来实现。对象结构型特点:可重用性较差。对象适配器允许一......
  • golang实现设计模式之观察者模式-优缺点,适用场景
    观察者模式是一种行为型模式,其定义一种订阅机制,可在对象事件发生时通知多个“观察”该对象的其他对象。观察者模式常用订阅/发布机制,即发布者持有所有订阅者,当发布者状态变更或者特定行为时,通知所有订阅者。结构1.发布者。属性及行为:属性,订阅者列表,行为,添加、删除订阅者方......
  • golang实现设计模式之模板模式-优缺点,适用场景
    模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。特点1.算法结构已确定。2.具体实现交由子类实现。结构1.抽象类(AbstractClass)。算法步骤可以被声明为抽......
  • 基于网卡地址做设备指纹的优缺点
    生成设备指纹的目的是为了能唯一地标识设备,而且这个标识在设备的生命周期内保持稳定。因此,在选择设备特征时,通常需要考虑这些特征的唯一性和稳定性。软件及配置信息一版不适合,是因为这类变化虽然不大,但万一变化后,设备指纹会变,影响使用。比如:操作系统信息:操作系统版本、安装日......
  • 4月29日邓老师设计模式面试资料 一般有用 看1
    【金三银四】设计模式篇1.谈谈你对设计模式的理解1.首先谈设计模式的作用:经验的传承,提高了软件复用的水平,最终达到提高软件开发效率设计原则简单说明单一职责一个类只负责一项职责里氏替换原则子类可以扩展父类的功能,但不能改变父类原有的功能依赖倒置原则要依......
  • 9.3 模版设计模式
    抽象类的设计应该是比类更高一层的设计。抽象类最大好处:1.对子类方法对统一管理;2.可以自身提供有一些普通方法,并且这些普通方法可以调用抽象方法(这些抽象方法必须在有子类提供实现的时候才会生效)abstractclassAction{ //定义公共行为类 publicstaticfinal......
  • Golang 配置代理
    通过 goget 命令下载各种依赖时,经常需要访问github/google等网站。配置好代理后,可以快速稳定的访问。常用的go代理goproxyhttps://goproxy.io/zh/阿里云https://mirrors.aliyun.com/goproxy/七牛云https://goproxy.cn设置go代理go1.13及以上版本可以直接用下面......
  • 性能测试-第01天-从理解到体验,最后能够对比说出Loadrunner和JMeter的优缺点
    更多功能测试以及全套学习路线图均在专栏,↑↑戳进去领取~系列文章目录......
  • 序) 设计模式参考资料
    https://sourcemaking.com/design_patternshttp://javapapers.com/design-patterns/  DesignPatternsInsoftwareengineering,a designpattern isageneralrepeatablesolutiontoacommonlyoccurringprobleminsoftwaredesign.Adesignpatternisn't......