如有错误或有补充,以及任何改进的意见,请留下您的高见
概念
职责链模式(Chain of Responsibility Pattern)是设计模式中的一种,属于行为型模式。它常用于处理多级请求,请求可以在多个处理对象之间传递,直到找到一个处理对象处理该请求为止。
职责链模式定义了一个处理请求的对象链。每个对象都可以是请求的发送者和接收者,且每个对象都有权处理请求或将其转发给链中的下一个对象。客户端只需要将请求发送到链的头部即可,而无需关心具体哪个对象会处理该请求。
实现方式
定义职责类:每个职责类都实现同一个接口,并覆盖接口中的方法。
构建职责链:将这些职责类链接起来,形成一个链表。
客户端请求:客户端向链表中的第一个职责类发送请求。
请求传递:如果当前职责类不能处理该请求,它会将请求传递给链表中的下一个职责类。这个过程会一直持续到有职责类能够处理该请求为止。
返回结果:一旦有职责类处理了请求,它会将结果返回给客户端。
优缺点
优点
解耦:客户端与具体处理请求的职责类解耦,客户端只需知道如何发送请求,而无需关心哪个职责类会处理该请求。
灵活性:可以动态地增加或删除职责类,只需修改链表即可,无需修改客户端代码。
多态性:通过实现相同的接口,可以使用不同的职责类来处理相同的请求。
缺点
系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 可能不容易观察运行时的特征,有碍于除错。
示例
假设有一个日志系统,可以记录不同级别的日志。我们可以使用职责链模式来设计这个系统:
public class Demo { public static void main(String[] args) { LogHandlerChain logHandlerChain = new LogHandlerChain(); logHandlerChain.log(2,"information1"); logHandlerChain.log(3,"information2"); logHandlerChain.log(1,"information3"); } } abstract class LogHandler { // 不同的level代表不同的日志 LogHandler next = null; // 写日志 void log(int level, String message) { } // 日志链中下一个日志类 void setNext(LogHandler next) { } } class ConsoleLogHandler extends LogHandler { @Override public void log(int level, String message) { if (level == 1) { System.out.println("ConsoleLogHandler:" + level + ": " + message); } else { next.log(level, message); } } @Override public void setNext(LogHandler next) { this.next = next; } } class FileLogHandler extends LogHandler { @Override public void log(int level, String message) { if (level == 2) { System.out.println("FileLogHandler:" + level + ": " + message); } else { next.log(level, message); } } @Override public void setNext(LogHandler next) { this.next = next; } } class OtherLogHandler extends LogHandler { @Override public void log(int level, String message) { System.out.println("OtherLogHandler:" + level + ": " + message); } } // 日志链 class LogHandlerChain { private ConsoleLogHandler consoleLogHandler; private FileLogHandler fileLogHandler; private OtherLogHandler otherLogHandler; public LogHandlerChain() { // 初始化日志类 consoleLogHandler = new ConsoleLogHandler(); fileLogHandler = new FileLogHandler(); otherLogHandler = new OtherLogHandler(); consoleLogHandler.setNext(fileLogHandler); fileLogHandler.setNext(otherLogHandler); } void log(int level, String message) { consoleLogHandler.log(level, message); } }
当需要记录日志时,只需将日志消息发送到链的头部:
这样,日志消息会在不同的处理器之间传递,直到找到一个能够处理该日志消息的处理器为止。