设计模式-策略模式(Chain of Responsibility)
概要
记忆关键词:传递请求,职责链接
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链发送请求,直到有一个对象处理它为止。
分析:当客户提交一个请求,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。
职责链模式结构图如下:
一、能解决什么问题?
二、涉及的角色
1. 抽象类Handler
统一的抽象类
1 abstract public class Handler { 2 protected Handler successor; 3 4 public void setSuccessor(Handler successor) { 5 this.successor = successor; 6 } 7 8 abstract String handleRequest(String msg); 9 10 }
2. ConcreteHandler
职责链模式的每一个具体 Handler类都继承自统一的抽象类
1 public class HandlerA extends Handler{ 2 @Override 3 String handleRequest(String msg) { 4 if(msg.contains("a")){ 5 msg = msg.replace('a', '*'); 6 } else if(this.successor != null){ 7 msg = this.successor.handleRequest(msg); 8 } 9 return msg; 10 } 11 }
3. Client
定义链的结构
## 2.优缺点分析
### 2.1 优点
- 由于是在客户端定义链的结构,因此可以随时地增加或者修改处理一个请求的结构,增强了给对象指派职责的灵活性
### 2.2 缺点
- debug:对代码Debug不太友好。在代码逻辑比较复杂,链路比较长的情况下,Debug可能要深入很多层。
## 3.注意事项
一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理,这就很糟糕了,需要事先考虑全面
## 4. 项目中的使用
- 过滤器Filter
当客户端对Web应用发出HTTP请求的时候,会首先经过Tomcat容器的一层层过滤器(Filter),过滤器会针对请求的访问权限、参数合法性等方面进行验证和过滤。
- Springboot中的拦截器:Interceptor
这一系列拦截器的处理流程,也同样是职责链模式的实现