美文网首页
设计模式——职责链模式

设计模式——职责链模式

作者: DevilRoshan | 来源:发表于2020-11-01 02:47 被阅读0次

什么是职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

实现

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()方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能

相关文章

网友评论

      本文标题:设计模式——职责链模式

      本文链接:https://www.haomeiwen.com/subject/ragjvktx.html