责任链模式详解

场景

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

一个职责节点的处理,依赖另一个职责节点的处理,形成一条依赖链条。这样可以保证,所有职责节点都可以处理到 Request 请求和 Response 响应。常见的如过滤器的实现方式。

职责节点的存储方式:

  • 以数组方式存储,通过接口传递依赖。

    在单个节点处理过程中,同时将代表职责链的数组传递进去,当前节点的处理依赖职责链中下一个节点的处理,以此形成递归效果。

  • 以对象包裹(依赖)的形式存储,通过内部属性传递依赖。

    最外层的职责链处理,一来内部包含的 next 节点的处理,以此形成依赖效果。

类图

针对请求做相应处理

    
        
            classDiagram
	direction BT
	class Request
	class RequestHandlerInterface{
		<<interface>>
		+ void handle(Request)
	}
	class Chain {
		<<abstract>>
		- RequestHandlerInterface nextHandler;
		+ void addHandler(RequestHandlerInterface);
		+ handle(Request);
	}
	class ValidateHandler {
		+ void addHandler(RequestHandlerInterface);
		+ handle(Request);
	}
	class SignatureHandler {
		+ void addHandler(RequestHandlerInterface);
		+ handle(Request);
	}
	RequestHandlerInterface --> Request
	Chain --|> RequestHandlerInterface
	Chain --o RequestHandlerInterface
	ValidateHandler --|> Chain
	SignatureHandler --|> Chain
	
	
	

        
    

针对请求/响应(request/response)

    
        
            classDiagram
	direction LR
	class Request
	class Response
	class FilterInterface {
		<<interface>>
		+ process(Request, RequestHandler)
	}
	class RequestHandler {
		- FilterInterface filters;
		- int position;
		+ Response handle(Request);
	}
	class UserFilter {
		+ process(Request, RequestHandler)
	}
	class ValidateFilter {
		+ process(Request, RequestHandler)
	}
	class RouteFilter {
		+ process(Request, RequestHandler)
	}
	FilterInterface --> RequestHandler
	RequestHandler --o FilterInterface
    RequestHandler --> Request
    RequestHandler --> Response
	UserFilter--|> FilterInterface
	ValidateFilter--|> FilterInterface
	RouteFilter --|> FilterInterface

        
    

优点

  • 控制请求处理的顺序
  • 符合单一职责。客户端代码和处理操作进行解耦。
  • 符合开闭原则。可以在不改变现有代码情况下对处理操作进行扩展。
  • 部分请求可以不处理