设计模式-责任链模式

本文介绍了责任链模式,一种在事件系统、日志处理、工作流和Web开发中的行为设计模式。通过使用handler类及其execute和setNext方法,请求可以在处理者链中按顺序传递,直到找到合适的处理者执行。示例展示了如何在购物车支付留存场景中应用此模式。
摘要由CSDN通过智能技术生成

什么是责任链模式

在这里插入图片描述
责任链模式是一种行为设计模式,它让你可以将请求沿着处理者链进行发送。收到请求后,每个处理者都可以处理请求,或者将其传递给链上的下一个处理者。

适用于什么场景

  • 事件/消息系统:在 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)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值