欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > java设计模式:04-01-责任链模式

java设计模式:04-01-责任链模式

2024/10/24 21:30:20 来源:https://blog.csdn.net/Mr_Air_Boy/article/details/140627029  浏览:    关键词:java设计模式:04-01-责任链模式

责任链模式(Chain of Responsibility Pattern)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。

责任链模式的应用场景

  • 审批流程:在审批流程中,不同级别的管理者对请求进行审批,低级别无法处理的请求会传递给高级别的管理者。
  • 事件处理系统:在事件处理系统中,事件从一个处理器传递到另一个处理器,直到有处理器处理该事件。
  • 日志记录系统:不同的日志记录器处理不同级别的日志信息,低级别的日志记录器无法处理的日志信息会传递给高级别的日志记录器。

责任链模式的实现方式

1. 基本责任链模式

思想:将多个处理对象连成一条链,并沿着这条链传递请求,直到有对象处理它。

实现方式

// 抽象处理者
abstract class Handler {protected Handler successor;public void setSuccessor(Handler successor) {this.successor = successor;}public abstract void handleRequest(int request);
}// 具体处理者1
class ConcreteHandler1 extends Handler {public void handleRequest(int request) {if (request < 10) {System.out.println("ConcreteHandler1 handled request: " + request);} else if (successor != null) {successor.handleRequest(request);}}
}// 具体处理者2
class ConcreteHandler2 extends Handler {public void handleRequest(int request) {if (request >= 10 && request < 20) {System.out.println("ConcreteHandler2 handled request: " + request);} else if (successor != null) {successor.handleRequest(request);}}
}// 具体处理者3
class ConcreteHandler3 extends Handler {public void handleRequest(int request) {if (request >= 20) {System.out.println("ConcreteHandler3 handled request: " + request);} else if (successor != null) {successor.handleRequest(request);}}
}// 客户端代码
public class ChainOfResponsibilityPattern {public static void main(String[] args) {Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();Handler handler3 = new ConcreteHandler3();handler1.setSuccessor(handler2);handler2.setSuccessor(handler3);int[] requests = {2, 14, 22, 18, 3, 27};for (int request : requests) {handler1.handleRequest(request);}}
}

优点

  • 减少耦合:请求的发送者和接收者解耦。
  • 增强灵活性:可以动态地改变链内的成员或调整链的顺序。
  • 职责分离:每个处理者只需要处理自己负责的那部分请求。

缺点

  • 请求处理可能无结果:如果链内没有合适的处理者,请求可能会落空。
  • 性能开销:链的长度可能会影响请求的处理时间。
2. 使用职责链模式处理日志记录

思想:不同级别的日志记录器处理不同级别的日志信息。

实现方式

// 抽象日志记录器
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);}}protected abstract void write(String message);
}// 信息级别日志记录器
class InfoLogger extends Logger {public InfoLogger(int level) {this.level = level;}protected void write(String message) {System.out.println("Info Logger: " + message);}
}// 调试级别日志记录器
class DebugLogger extends Logger {public DebugLogger(int level) {this.level = level;}protected void write(String message) {System.out.println("Debug Logger: " + message);}
}// 错误级别日志记录器
class ErrorLogger extends Logger {public ErrorLogger(int level) {this.level = level;}protected void write(String message) {System.out.println("Error Logger: " + message);}
}// 客户端代码
public class ChainOfResponsibilityLogger {private static Logger getChainOfLoggers() {Logger errorLogger = new ErrorLogger(Logger.ERROR);Logger debugLogger = new DebugLogger(Logger.DEBUG);Logger infoLogger = new InfoLogger(Logger.INFO);infoLogger.setNextLogger(debugLogger);debugLogger.setNextLogger(errorLogger);return infoLogger;}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.");}
}

优点

  • 灵活性高:可以根据需要增加或删除日志记录器。
  • 职责分离:不同级别的日志由不同的记录器处理,符合单一职责原则。

缺点

  • 请求处理可能无结果:如果没有合适的日志记录器,日志信息可能会丢失。
  • 性能开销:链的长度可能会影响日志的记录速度。

总结

责任链模式优点缺点
基本责任链模式减少耦合,增强灵活性,职责分离请求处理可能无结果,性能开销
处理日志记录灵活性高,职责分离请求处理可能无结果,性能开销

选择哪种实现方式应根据具体的需求和系统的复杂度来决定。基本责任链模式适用于一般的请求处理场景,而处理日志记录的职责链模式更适用于需要不同级别处理的日志记录系统。通过合理的设计,可以充分利用责任链模式的优势,减少耦合,提高系统的灵活性和可扩展性。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com