模式定义
使多个对象都有机会解决申请,从而防止申请的发送者和接受者之间耦合关系,将这些对象连成一条链,并沿着这条链传递申请,直到有一个对象解决它为止
类图
要点总结
- Chain of Responsibility模式的利用场合在于“一个申请可能有多个接受者,然而最初真正的接受者只有一个”,这时候申请发送者与接受者的耦合有可能呈现“变动软弱”的症状,职责链的目标就是将二者解耦,从而更好地应答变动
- 利用了Chain of Responsibility模式后,对象的职责调配将更具灵活性,咱们能够在运行时动静增加、批改申请的解决职责
- 如果申请传递到职责链的开端任得不到解决,应该有一个正当的缺省机制,这也是每一个接受者对象的责任,而不是发出请求的对象的责任
Go语言代码实现
工程目录
responsibility_chain.go
package Responsibility_Chainimport "strconv"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 (h *handler) Handler(handlerID int) string{ if h.handlerID == handlerID{ return h.name + " handled " + strconv.Itoa(handlerID) } return h.next.Handler(handlerID)}
responsibility_chain_test.go
package Responsibility_Chainimport ( "fmt" "testing")func TestNewHandler(t *testing.T) { wang := NewHandler("laowang", nil, 1) zhang := NewHandler("lanzhang", wang, 2) r := wang.Handler(1) fmt.Println(r) r = zhang.Handler(2) fmt.Println(r)}