设计模式--责任链(Responsibility_Chain)模式

模式定义

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

类图

设计模式--责任链(Responsibility_Chain)模式_第1张图片

要点总结

  • Chain of Responsibility模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,这时候请求发送者与接受者的耦合有可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应对变化
  • 应用了Chain of Responsibility模式后,对象的职责分配将更具灵活性,我们可以在运行时动态添加、修改请求的处理职责
  • 如果请求传递到职责链的末尾任得不到处理,应该有一个合理的缺省机制,这也是每一个接受者对象的责任,而不是发出请求的对象的责任

Go语言代码实现

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许将请求沿着处理链传递,直到有一个处理者能够处理该请求,或者请求到达链的末尾而无法处理。

责任链模式的核心思想是将处理请求的对象组成一个链条,每个对象都有机会处理请求,如果当前对象无法处理请求,则将请求传递给下一个对象,直到有一个对象能够处理请求或者到达链的末尾。

下面是一个简单的例子来说明责任链模式的应用:

package main

import "fmt"

// Handler 处理者接口
type Handler interface {
	SetNext(handler Handler)
	HandleRequest(request string)
}

// ConcreteHandler 具体处理者
type ConcreteHandler struct {
	next    Handler
	handlerName string
}

func NewConcreteHandler(handlerName string) *ConcreteHandler {
	return &ConcreteHandler{
		handlerName: handlerName,
	}
}

func (h *ConcreteHandler) SetNext(handler Handler) {
	h.next = handler
}

func (h *ConcreteHandler) HandleRequest(request string) {
	if h.canHandleRequest(request) {
		fmt.Printf("%s handled the request: %s\n", h.handlerName, request)
	} else if h.next != nil {
		fmt.Printf("%s cannot handle the request, passing it to the next handler\n", h.handlerName)
		h.next.HandleRequest(request)
	} else {
		fmt.Printf("No handler can handle the request: %s\n", request)
	}
}

func (h *ConcreteHandler) canHandleRequest(request string) bool {
	// 检查是否可以处理请求的逻辑
	return request == h.handlerName
}

func main() {
	handlerA := NewConcreteHandler("Handler A")
	handlerB := NewConcreteHandler("Handler B")
	handlerC := NewConcreteHandler("Handler C")

	handlerA.SetNext(handlerB)
	handlerB.SetNext(handlerC)

	// 创建请求
	requests := []string{"Handler A", "Handler B", "Handler C", "Handler D"}

	// 处理请求
	for _, request := range requests {
		handlerA.HandleRequest(request)
	}
}

在上述示例中,我们定义了处理者接口Handler,其中包含设置下一个处理者和处理请求的方法。

具体处理者类ConcreteHandler实现了处理者接口。每个具体处理者都有一个处理者名称handlerName和一个指向下一个处理者的引用next。

在处理请求时,每个具体处理者首先检查是否可以处理该请求。如果可以处理,则进行处理并打印相应信息;否则,将请求传递给下一个处理者。如果已经达到链的末尾,即无法处理该请求,则打印相应的信息。

在main函数中,我们创建了三个具体处理者handlerA、handlerB和handlerC,并将它们按顺序连接起来,形成一个处理链。

然后,我们创建了一系列请求,并通过调用handlerA的HandleRequest方法将请求传递给处理链中的各个处理者进行处理。

通过责任链模式,我们可以动态地组织处理者对象的顺序,并灵活地处理不同类型的请求。每个具体处理者只需关注自己是否能够处理请求,而无需关注整个处理过程。这提高了代码的可维护性和扩展性。

你可能感兴趣的:(GO,设计模式,设计模式,go,golang)