责任链模式是一种行为设计模式,它使多个对象能够按照顺序依次处理请求,直到找到能够处理请求的对象为止。每个对象都有机会处理请求或者将其传递给下一个对象。
在责任链模式中,通常会创建一个抽象处理器类,其中包含一个指向下一个处理器的引用。具体的处理器类继承自抽象处理器类,并实现自己的处理逻辑。当收到请求时,首先由第一个处理器处理,如果该处理器无法处理,则将请求传递给下一个处理器,依次类推,直到找到可以处理请求的处理器为止。
责任链模式的优点包括:
- 解耦请求发送者和接收者:请求发送者不需要知道哪个对象最终会处理请求,只需将请求发送到责任链上,由处理器对象决定如何处理。
- 动态组合和修改职责:可以根据需要动态地增加、删除或修改处理器对象,灵活地调整责任链的结构。
- 可以避免请求的发送者与接收者之间的紧耦合关系。
然而,责任链模式也有一些注意事项:
- 链中的某个处理器必须能够处理所有可能的请求,否则可能会出现请求无法得到处理的情况。
- 可能会导致请求的处理时间加长,因为每个处理器都需要判断是否能够处理请求。
责任链模式在实际应用中广泛用于日志记录、权限验证、异常处理等场景。它可以提供一种灵活且可扩展的方式来解决复杂的业务逻辑处理问题。
下面通过Spring示例来演示下,直接上代码。
package com.example.jsoupexample.test.dp.zrl;
/**
* @author Mr.Zhang
* @version 1.0.0
* @description: 责任链抽象类,业务类直接继承实现handleTest方法即可
* @since 2023/8/23 10:32
*/
public abstract class ChainOfResponsibilityHandler {
/**
* 下一链
*/
protected ChainOfResponsibilityHandler chainNext;
/**
* 设置下一链
* @param chain
*/
public void setChain(ChainOfResponsibilityHandler chain){
this.chainNext=chain;
}
/**
* 处理业务方法
* @param chain
*/
public abstract void handleTest(String chain);
}
2.创建链条:也就是绑定三个业务链,业务类直接ioc即可
package com.example.jsoupexample.test.dp.zrl;
import org.springframework.stereotype.Component;
/**
* @author Mr.Zhang
* @version 1.0.0
* @description: a业务
* @since 2023/8/23 10:08
*/
@Component
public class AChainOfResponsibilityHandler extends ChainOfResponsibilityHandler {
@Override
public void handleTest(String chain) {
//业务方法
System.out.println(chain+"测试:"+this.getClass());
if (chainNext==null){
return;
}
//必须执行代码
chainNext.handleTest(chain);
}
}
package com.example.jsoupexample.test.dp.zrl;
import org.springframework.stereotype.Component;
/**
* @author Mr.Zhang
* @version 1.0.0
* @description: b业务
* @since 2023/8/23 10:08
*/
@Component
public class BChainOfResponsibilityHandler extends ChainOfResponsibilityHandler {
@Override
public void handleTest(String chain) {
System.out.println(chain+"测试:"+this.getClass());
if (chainNext==null){
return;
}
chainNext.handleTest(chain);
}
}
package com.example.jsoupexample.test.dp.zrl;
import org.springframework.stereotype.Component;
/**
* @author Mr.Zhang
* @version 1.0.0
* @description: c业务
* @since 2023/8/23 10:08
*/
@Component
public class CChainOfResponsibilityHandler extends ChainOfResponsibilityHandler {
@Override
public void handleTest(String chain) {
System.out.println(chain+"测试:"+this.getClass());
if (chainNext==null){
return;
}
chainNext.handleTest(chain);
}
}
3.创建一个springTest测试类,创建测试方法,并注入ChainOfResponsibilityHandler 类型所有子类集合,实例看代码。
package com.example.jsoupexample;
import com.example.jsoupexample.test.dp.zrl.ChainOfResponsibilityHandler;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
class JsoupExampleApplicationTests {
/**
* 注入所有ChainOfResponsibilityHandler 子类被ioc的
*/
@Autowired
private List<ChainOfResponsibilityHandler> chainOfResponsibilityHandlers;
@Test
void contextLoads() {
for (int i = 0; i < chainOfResponsibilityHandlers.size()-1; i++) {
ChainOfResponsibilityHandler chain = chainOfResponsibilityHandlers.get(i);
chain.setChain( chainOfResponsibilityHandlers.get(i+1));
}
//取最顶部链
ChainOfResponsibilityHandler chain = chainOfResponsibilityHandlers.get(0);
chain.handleTest("牛奶");
}
}
每个业务方法按照顺序执行了。
4.
责任链模式可以在以下场景中使用:
-
过滤器链:在Web开发中,可以使用责任链模式来处理过滤器链。每个过滤器可以负责不同的请求处理逻辑,然后将请求传递给下一个过滤器。例如,使用责任链模式可以实现身份验证、数据校验、日志记录等功能。
-
拦截器链:Spring MVC框架中的拦截器就是一种典型的责任链模式的应用。通过配置多个拦截器并定义它们的顺序,可以实现对请求进行预处理、后处理和异常处理等操作。
-
事件驱动机制:Spring框架提供了事件机制,可以使用责任链模式来实现事件的处理。每个事件处理器都可以注册为事件监听器,并按照一定的顺序进行事件处理。
-
AOP切面链:在Spring框架的AOP(面向切面编程)中,可以使用责任链模式来实现切面的执行链。每个切面可以负责不同的横切关注点,然后将控制权传递给下一个切面。
-
配置解析链:在Spring框架中,可以使用责任链模式来解析复杂的配置信息。每个解析器负责解析不同的配置元素,然后将结果传递给下一个解析器。