设计模式深度解析:职责链模式(Chain of Responsibility Pattern)及其应用实践
什么是职责链模式?
职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求沿着处理链传递,直到有一个处理者能够处理该请求。这种模式解耦了请求的发送者和接收者,使得多个对象都有机会处理请求。
核心概念
- 处理者(Handler):定义处理请求的接口,通常包含一个指向下一个处理者的引用。
- 具体处理者(Concrete Handler):实现处理请求的具体逻辑,如果不能处理则传递给下一个处理者。
- 客户端(Client):初始化请求并将其发送到链的第一个处理者。
代码示例
以下是一个简单的职责链模式实现,模拟一个日志记录系统,不同级别的日志由不同的处理者处理:
// 抽象处理者
abstract class Logger {
public static int INFO = 1;
public static int DEBUG = 2;
public static int ERROR = 3;
protected int level;
protected Logger nextLogger;
public void setNextLogger(Logger nextLogger) {
this.nextLogger = nextLogger;
}
public void logMessage(int level, String message) {
if (this.level <= level) {
write(message);
}
if (nextLogger != null) {
nextLogger.logMessage(level, message);
}
}
abstract protected void write(String message);
}
// 具体处理者:控制台日志
class ConsoleLogger extends Logger {
public ConsoleLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Console Logger: " + message);
}
}
// 具体处理者:文件日志
class FileLogger extends Logger {
public FileLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("File Logger: " + message);
}
}
// 具体处理者:错误日志
class ErrorLogger extends Logger {
public ErrorLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("Error Logger: " + message);
}
}
// 客户端代码
public class ChainPatternDemo {
public static void main(String[] args) {
Logger consoleLogger = new ConsoleLogger(Logger.INFO);
Logger fileLogger = new FileLogger(Logger.DEBUG);
Logger errorLogger = new ErrorLogger(Logger.ERROR);
consoleLogger.setNextLogger(fileLogger);
fileLogger.setNextLogger(errorLogger);
consoleLogger.logMessage(Logger.INFO, "This is an information.");
consoleLogger.logMessage(Logger.DEBUG, "This is a debug level information.");
consoleLogger.logMessage(Logger.ERROR, "This is an error information.");
}
}
应用场景:审批流程
职责链模式非常适合用于审批流程,例如请假审批:
- 普通员工:请假1天内直接批准。
- 部门经理:请假3天内批准。
- 总经理:请假7天内批准。
- 董事会:请假超过7天需董事会审批。
通过职责链模式,可以灵活地扩展审批流程,而无需修改现有代码。
总结
职责链模式通过解耦请求的发送者和接收者,提高了系统的灵活性和可扩展性。它适用于多级处理或动态指定处理者的场景。