golang 责任链模式

130 阅读1分钟

在项目中,遇到登陆问题,比如微信登陆,qq登陆,小程序登陆等待,如果后端去判断,可能会写非常多的if else 这样代码会非常的不雅观,难懂。或者一个流程,需要不同的人去处理,这都是相似的问题

这个时候,就可以用责任链模式

责任链模式 优点 :

① 解耦 : 请求的 发送者 和 接收者 解耦 ; 接收者 是 请求的处理者 ;

② 动态组合 : 责任链 可以 动态组合 , 使用配置 设置责任链的 顺序及 是否出现 ; 可以随时对责任链排序 , 随时增加拆除责任链中的某个请求对象 ;

责任链模式 缺点 :

① 性能 : 如果 责任链 太长 , 或责任链中请求的 处理时间过长 , 可能会 影响性能 ;

② 个数 : 责任链 可能过多 ;

golang代码实现


package main

import (
   "fmt"
   "strconv"
)
//定义接口,结构体实现接口
type HandlerI interface {
   Handler(handlerId int)
}

type handler struct {
   name      string
   //这里有坑,是要实现了这个接口的结构体,都可以赋值进来,一开始没搞懂
   next      HandlerI
   handlerId int
}

func NewHandle(name string, next HandlerI, handlerId int) *handler {
   return &handler{
      name:      name,
      next:      next,
      handlerId: handlerId,
   }
}

func (h *handler) Handler(handlerId int) {
   if h.handlerId == handlerId {
      fmt.Println(h.name + "登陆了" + strconv.Itoa(handlerId))
   } else {
   //查找当前结构体的结构体(next)的Handler方法,就可以接着往下处理
      h.next.Handler(handlerId)
   }
}

func main() {
//定义结构体,里面内嵌下一个结构体,也是调用链
   weibo := NewHandle("weibo", nil, 3)
   qq := NewHandle("qq", weibo, 2)
   weixin := NewHandle("weixin", qq, 1)

   weixin.Handler(3)
   weibo.Handler(3)
}
效果:

图片.png