什么是责任链模式
责任链模式是一种行为设计模式,它让你可以将请求沿着处理者链进行发送。收到请求后,每个处理者都可以处理请求,或者将其传递给链上的下一个处理者。
适用于什么场景
- 事件/消息系统:在 GUI编程中,当一个事件(如鼠标点击、键盘按键)发生时,这个事件可能会被多个监听器监听并处理。这些监听器就形成了一个责任链。
- 日志记录:日志的处理通常会有多级,如 debug、info、error等。这些处理级别就可以形成一个责任链,每个级别的处理器决定是否处理该消息并决定是否将消息传递给下一个处理器。
- 工作流或审批流程:在一个工作流中,一个任务可能需要多个不同的对象(或步骤)进行处理,这些对象就可以形成一个责任链。
- 拦截器(Interceptor):在 Web开发中,拦截器用于在请求被实际处理之前或之后执行某些操作,如身份验证、日志记录、数据压缩等。这些拦截器可以形成一个责任链,每个拦截器决定是否将请求传递给下一个拦截器。
- 购物车
- 支付留存等
uml图
type Handler interface {
execute(pms *Pms) error
setNext(Handler)
}
type handlerA struct {
next Handler
}
func (h *handlerA) execute(pms *Pms) error {
if pms.isLogin {
return h.next.execute(pms)
}
return fmt.Errorf("not login")
}
func (h *handlerA) setNext(next Handler) {
h.next = next
}
type handlerB struct {
next Handler
}
func (h *handlerB) execute(pms *Pms) error {
if pms.isPay {
return h.next.execute(pms)
}
return fmt.Errorf("not pay")
}
func (h *handlerB) setNext(next Handler) {
h.next = next
}
type handlerC struct {
next Handler
}
func (h *handlerC) execute(pms *Pms) error {
if pms.isFh {
if h.next == nil {
fmt.Println("fh success")
return nil
} else {
return h.next.execute(pms)
}
}
return fmt.Errorf("not fh")
}
func (h *handlerC) setNext(next Handler) {
h.next = next
}
type Pms struct {
name string
isLogin bool
isPay bool
isFh bool
}
func ExecuteReponsibility() {
pms := &Pms{
name: "test",
isLogin: true,
isPay: true,
isFh: true,
}
handlerA := &handlerA{}
handlerB := &handlerB{}
handlerC := &handlerC{}
handlerA.setNext(handlerB)
handlerB.setNext(handlerC)
handlerA.execute(pms)
}