什么是职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
实现
type Handler interface {
Handler(handlerID int) string
}
type handler struct {
name string
next Handler
handlerID int
}
func NewHandler(name string, next Handler, handlerID int) *handler {
return &handler{
name: name,
next: next,
handlerID: handlerID,
}
}
func (this *handler)Handler(handlerID int) string {
if this.handlerID == handlerID {
return this.name + " handled " + strconv.Itoa(handlerID)
}
return this.next.Handler(handlerID)
}
func TestNewHandler(t *testing.T) {
yang := NewHandler("laoyang", nil, 1)
chuan := NewHandler("laochuang", yang, 2)
res := yang.Handler(1)
fmt.Println(res)
res = chuan.Handler(1)
fmt.Println(res)
}
// === RUN TestNewHandler
// laoyang handled 1
// laoyang handled 1
// --- PASS: TestNewHandler (0.00s)
//PASS
优点
- 将请求和处理分开,实现解耦,提高系统的灵活性;
- 简化了对象,使对象不需要知道链的结构。
缺点
- 性能会收到影响,特别是在链比较长的时候;
- 调试不方便。采用了类似递归的方式,调试时逻辑可能比较复杂;
- 不能保证请求一定被接收。
使用场景
- 有多个对象可以处理同一个请求;
- 在不明确指定接收者的情况下,向多个对象中的提交请求;
- 可动态指定一组对象处理请求。
注意
- 需控制链中最大节点数量,一般通过在Handler中设置一个最大节点数量,在setNext()方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能
网友评论