在项目中,遇到登陆问题,比如微信登陆,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)
}