类似于责任链模式吧,不同类实现相同的入参,执行不同的操作,一个执行完再确定要不要执行下一个。
用go实现:
1.定义一个接口
后面所有的handler都要实现这个接口的handler方法
type IHandler interface {/**true 表示通过 false 表示后面就不用再跑了*/Handler(requestSeatContext *model.RequestSeatContext) bool
}
2.定义接口的入参,
为了测试,只写一个参数,参数只有一个属性,代表是否执行下一个handler
实际生成中,各个handler就是靠这个传递信息的
type RequestSeatContext struct {LastHandlerOK bool
}
3.定义接口实现,
我们定义3个实现对象
a.解析参数的handler
b.执行abtest的handler
c.输出log日志的handler
type RequestHandler struct {name string
}
func (handler *RequestHandler) Handler(requestSeatContext *model.RequestSeatContext) bool {if !requestSeatContext.LastHandlerOK {return false}fmt.Println("RequestHandler 执行")return true
}
type AbTestHandler struct {name string
}
func (handler *AbTestHandler) Handler(requestSeatContext *model.RequestSeatContext) bool {if !requestSeatContext.LastHandlerOK {return false}fmt.Println("AbTestHandler 执行")return true
}
type LogHandler struct {name string
}
func (handler *LogHandler) Handler(requestSeatContext *model.RequestSeatContext) bool {if !requestSeatContext.LastHandlerOK {return false}fmt.Println("LogHandler 执行")return true
}
4.确定handler执行顺序,定义各个handler组成的数组
var (requestHandlers []IHandler
)
requestHandlers = []IHandler{&myhandler.RequestHandler{}, //1. 解析参数&AbTestHandler{}, //2. abtest&LogHandler{}, //3. 日志处理}
5.初始化handler入参
requestSeatContext := &model.RequestSeatContext{LastHandlerOK:true,}
6.执行handler
//执行for _, handler := range requestHandlers {requestSeatContext.LastHandlerOK = handler.Handler(requestSeatContext)}
执行结果
RequestHandler 执行
AbTestHandler 执行
LogHandler 执行
如果把中间的AbTestHandler的handler方法的返回值改为false
执行结果就变成:
RequestHandler 执行
AbTestHandler 执行