职责链模式是一种行为涉及模式,它在很多场景都有应用,典型的像中间件,拦截器等框架组件都是应用这种设计模式。
我们自己简单用go实现以下职责链模式,它应该应对一个流程,流程中每个步骤都应由一个处理对象来完成逻辑抽象、所有处理对象都应该提供统一的处理自身逻辑的方法,其次还应该维护指向下一个处理对象的引用,当前步骤自己逻辑处理完后,就调用下一个对象的处理方法,把请求交给后面的对象进行处理,依次递进直到流程结束。
type Handler interface {
Do(c *context.Context) error //
SetNext(h Handler) Handler // 设置下一个流程
Run(c *context.Context) error // 执行
}
type Next struct {
nextHandler Handler // 下一个流程
}
func (n *Next) SetNext(h Handler) Handler {
n.nextHandler = h
return h
}
// Run 执行
func (n *Next) Run(c *context.Context) error {
if n.nextHandler != nil {
if err := (n.nextHandler).Do(c); err != nil {
return err
}
return (n.nextHandler).Run(c) // 执行下一个handler的Run
}
return nil
}
// NullHandler 空Handler, 作为载体
type NullHandler struct {
Next
}
func (h *NullHandler) Do(c *context.Context) (err error) {
return
}
测试:
type Arguments1Handler struct {
Next
}
func (h *Arguments1Handler) Do(c *context.Context) (err error) {
fmt.Println("校验参数1成功...")
return
}
type Arguments2Handler struct {
Next
}
func (h *Arguments2Handler) Do(c *context.Context) (err error) {
fmt.Println("校验参数2成功...")
return
}
func main() {
// 初始化空handler
nullHandler := &NullHandler{}
// 链式调用
nullHandler.SetNext(&Arguments1Handler{}).
SetNext(&Arguments2Handler{})
// 开始执行业务
ctx := context.Background()
if err := nullHandler.Run(&ctx); err != nil {
fmt.Println("Fail | Error:" + err.Error())
return
}
return
}
输出:
image.png参考资料
1、https://blog.csdn.net/zhghost/article/details/103515858
网友评论