本文共 3366 字,大约阅读时间需要 11 分钟。
责任链设计模式(Chain of Responsibility Pattern)是一种行为型设计模式,其核心思想是通过定义一个接收者链,解耦请求的发送者和接收者,使得请求的处理过程可以按照一定的顺序传递下去,直到找到能够处理该请求的对象或者链的结束。
这种设计模式的典型应用场景是处理具有递归性或按顺序执行的任务,例如日志记录、过滤器链、事务处理等。在Java开发中,责任链模式广泛应用于诸如MyBatis拦截器、Spring MVC过滤器链等场景。
责任链设计模式可以通过类图和序列图来直观理解:
在实际开发中,责任链设计模式可以通过多个日志记录器组成一个链来实现不同的日志级别处理。例如,Logback框架中的Logger接口通过Lambda表达式实现了责任链:
public interface Logger { enum LogLevel { INFO, DEBUG, WARNING, ERROR, FUNCTIONAL_MESSAGE, FUNCTIONAL_ERROR; } void message(String msg, LogLevel severity); default Logger appendNext(Logger nextLogger) { return (msg, severity) -> { message(msg, severity); nextLogger.message(msg, severity); }; } static Logger logger(LogLevel[] levels, Consumer writeMessage) { return (msg, severity) -> { if (levels.contains(severity)) { writeMessage.accept(msg); } }; } static Logger consoleLogger(LogLevel... levels) { return logger(levels, msg -> System.err.println("写到终端: " + msg)); } static Logger emailLogger(LogLevel... levels) { return logger(levels, msg -> System.err.println("通过邮件发送: " + msg)); } static Logger fileLogger(LogLevel... levels) { return logger(levels, msg -> System.err.println("写到日志文件中: " + msg)); }} 通过这种方式,可以灵活配置日志记录链,例如:
Logger logger = consoleLogger(LogLevel.all()) .appendNext(emailLogger(LogLevel.FUNCTIONAL_MESSAGE, LogLevel.FUNCTIONAL_ERROR)) .appendNext(fileLogger(LogLevel.WARNING, LogLevel.ERROR));
在Web开发中,过滤器链(FilterChain)是责任链设计模式的典型应用之一。例如,Tomcat容器中的ApplicationFilterChain通过管理多个过滤器,按照一定顺序执行每个过滤器的doFilter方法。
MyBatis框架中的拦截器链也是一个典型的责任链应用。通过InterceptorChain类管理多个拦截器,依次对目标进行处理。例如:
public class InterceptorChain { private final List interceptors = new ArrayList<>(); public Object pluginAll(Object target) { for (Interceptor interceptor : interceptors) { target = interceptor.plugin(target); } return target; } public void addInterceptor(Interceptor interceptor) { interceptors.add(interceptor); } public List getInterceptors() { return Collections.unmodifiableList(interceptors); }} 在MyBatis拦截器中,多个拦截器可以通过依次调用plugin方法来处理同一类型的任务。通过InterceptorChain类的pluginAll方法,依次为目标生成代理对象,实现链式处理。
通过责任链的设计模式,可以通过自定义接收者的顺序来控制执行顺序。例如,通过在初始化链时指定接收者的顺序,或者在运行时动态地修改接收者的链。
通过对责任链设计模式的学习与实践,我们可以更好地理解其核心思想,并在实际开发中灵活应用。关键在于:
在实际业务中,如果需要顺序执行多个任务或处理单元,可以考虑使用责任链设计模式。同时,关注框架源码中的链结构(如chain关键字),往往能发现责任链设计模式的身影。
如果你有关于Lambda函数式编程在责任链中的应用,或者多个拦截器的责任链顺序控制的具体方案,欢迎在评论区分享你的思考与经验。
转载地址:http://cgqzz.baihongyu.com/