责任链模式(Chain Of Responsibility Pattern)
1.策略模式(Strategy Pattern)2.桥接模式(Bridge Pattern)3.代理模式(Proxy Pattern)4.中介者模式(Mediator Pattern)5.过滤器模式(Filter Pattern)6.适配器模式(Adapter Pattern)
7.责任链模式(Chain Of Responsibility Pattern)
8.装饰器模式(Decorator Pattern)9.建造者模式(Builder Pattern)10.观察者模式(Observer Pattern)11.工厂模式(Factory Pattern)12.单例模式(Singleton Pattern)13.组合模式(Composite Pattern)14.模板模式(Template Pattern)15.原型模式(Prototype Pattern)16.外观模式(Facade Pattern)17.享元模式(Flyweight Pattern)18.命令模式(Command Pattern)19.解释器模式(Interpreter Pattern)20.迭代器模式(Iterator Pattern)责任链模式
一、什么是责任链模式?
责任链模式(Chain Of Responsibility Pattern)为请求创建了一个接收者对象的链。对请求的发送者和接收者进行解耦,这种类型的设计模式属于行为者模式。
责任链模式,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,以此类推。
二、责任链模式的作用
让请求发送者和接收者解耦。责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上,无需关心请求的处理细节和请求的传递。
JS 中的事件冒泡。JAVA WEB 中 Apache Tomcat 对 Encoding 的处理,Struts2 的拦截器,jsp servlet 的 Filter。 都使用了责任链模式。
三、责任链模式的优缺点
1、优点
- 降低耦合度,将请求的发送者和接收者解耦。
- 简化了对象,使对象不需要知道链的结构。
- 增加了灵活性,可以通过改变责任链内的成员或次序,允许动态修改责任。
- 增加新的请求处理类很方便。
2、缺点
- 不能保证请求一定被接收。
- 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
- 可能不容易观察运行时的特征,有碍于除错。
四、责任链具体代码实现
1、结构图

2、主要角色
- Handler 处理者:定义了处理请求的接口,handler知道,下一个处理者是谁,如果自己无法处理请求,就转给下一个处理者
- concreteHandler 具体处理者:具体的处理者是处理请求的具体角色
- Client 请求客户:请求者角色,就是向第一个具体的handler发送请求的角色,并连接好责任链
3、具体java代码
Handler 处理:
package com.designpattern.chainOfResponsibilityPattern;
/**
* 抽象日志类
* Handler 处理者
* 定义了处理请求的接口,handler知道,下一个处理者是谁,如果自己无法处理请求,就转给下一个处理者。
*
* @author zhongtao on 2018/10/23
*/
public abstract class AbstractLogger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
private int level;
public AbstractLogger(int level) {
this.level = level;
}
private AbstractLogger nextLogger;
/**
* 指定下一个处理者
*
* @param nextLogger
*/
public void setNextLogger(AbstractLogger nextLogger) {
this.nextLogger = nextLogger;
}
abstract public void write(String message);
public void logMessage(int level, String message) {
if (this.level == level) {
write(message);
}
if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
}
具体处理者:
/**
* 扩展了该记录器类的实体类
* 具体责任处理者
* @author zhongtao on 2018/10/23
*/
public class ConsoleLogger extends AbstractLogger {
public ConsoleLogger(int level) {
super(level);
}
@Override
public void write(String message) {
System.out.println("Standard Console: logger->" + message);
}
}
public class FileLogger extends AbstractLogger {
public FileLogger(int level) {
super(level);
}
@Override
public void write(String message) {
System.out.println("File : logger->" + message);
}
}
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level) {
super(level);
}
@Override
public void write(String message) {
System.out.println("Error Console: logger->" + message);
}
}
创建责任链:
package com.designpattern.chainOfResponsibilityPattern;
/**
* 创建责任链
*
* @author zhongtao on 2018/10/23
*/
public class ChainDemo {
public static AbstractLogger getChainOfLoggers() {
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
errorLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(consoleLogger);
return errorLogger;
}
}
测试责任链模式:
package com.designpattern.chainOfResponsibilityPattern;
import org.junit.Test;
/**
* 测试责任链模式
*
* @author zhongtao on 2018/10/23
*/
public class ChainPatternTest {
@Test
public void testChainPattern() {
AbstractLogger loggerChain = ChainDemo.getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "This is an information");
System.out.println();
loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information");
System.out.println();
loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information");
}
}
测试结果:
Standard Console: logger->This is an information
File : logger->This is an debug level information
Error Console: logger->This is an error information
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类