Chain of Responsibility(责任链)模式是一种行为型设计模式,用于处理请求的多个处理者之间的职责分配。它允许请求沿着一条处理链传递,直到有一个处理者能够处理它为止。这种模式可以避免请求发送者和请求处理者之间的紧耦合关系。
主要概念
- Handler(处理者):定义了处理请求的接口,并实现具体的处理逻辑。如果该处理者无法处理请求,它会将请求传递给链中的下一个处理者。
- ConcreteHandler(具体处理者):实现了
Handler
接口,处理请求。如果无法处理请求,它会将请求传递给链中的下一个处理者。 - Client(客户端):发起请求,并将请求传递给链中的第一个处理者。
主要角色
- Handler(处理者):定义了一个接口来处理请求,提供了设置和获取下一个处理者的机制。
- ConcreteHandler(具体处理者):实现了
Handler
接口,处理请求。如果无法处理,则将请求传递给链中的下一个处理者。 - Client(客户端):将请求传递给链中的第一个处理者。
示例代码
以下是一个简单的Chain of Responsibility模式的Java示例。假设我们有一个日志处理系统,每个处理者可以处理不同级别的日志请求(比如错误、警告和信息)。如果一个处理者无法处理该请求,它会将请求传递给链中的下一个处理者。
java// Handler接口 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 ChainOfResponsibilityDemo { private static Logger getChainOfLoggers() { Logger errorLogger = new ErrorLogger(Logger.ERROR); Logger fileLogger = new FileLogger(Logger.DEBUG); Logger consoleLogger = new ConsoleLogger(Logger.INFO); errorLogger.setNextLogger(fileLogger); fileLogger.setNextLogger(consoleLogger); return errorLogger; } public static void main(String[] args) { Logger loggerChain = getChainOfLoggers(); loggerChain.logMessage(Logger.INFO, "This is an information."); loggerChain.logMessage(Logger.DEBUG, "This is a debug level information."); loggerChain.logMessage(Logger.ERROR, "This is an error information."); } }
解释
- Logger:抽象类,定义了处理请求的方法和设置下一个处理者的方法。还定义了日志级别。
- ConsoleLogger、FileLogger、ErrorLogger:具体的处理者类,实现了
write
方法,处理不同级别的日志请求。 - ChainOfResponsibilityDemo:客户端代码,设置了处理链并发送不同级别的日志请求。
优点
- 解耦:请求的发送者和处理者之间解耦,增加了灵活性。
- 可扩展性:可以在链中添加新的处理者而无需修改现有代码。
- 动态改变链结构:可以在运行时动态调整处理链的结构。
缺点
- 调试难度:链的结构可能会使调试变得复杂,因为请求可能会被传递到链的多个处理者中。
Chain of Responsibility模式特别适用于需要处理多个请求的系统,能够有效地处理请求和分配责任。
标签:请求,Chain,处理,Handler,Responsibility,设计模式,public From: https://www.cnblogs.com/spicy-food/p/18383349