设计模式_责任链模式
模式:行为型模式
在我们开发的过程中,常常会遇到有些框架或者小工具使用了责任链这个设计模式。
例如说,日志工具或 Netty
。我们挑日志工具中作为例子。
在实际开发环境中,日志常常有不同的等级(info
/warn
/error
)输出。
但是我们该如何规划这个代码的编写。可能有人就说,这个简单,我马上写一个给你。
/**
* @param level 日志等级,使用数字来表示
* @param message 需要输出的日志信息
* */
public void log(int level, String message) {
switch (level) {
case INFO:
System.out.println("日志等级是 :INFO." + "接受信息为:" + message);
break;
case WARN:
System.out.println("日志等级是 :WARN." + "接受信息为:" + message);
break;
case ERROR:
System.out.println("日志等级是 :ERROR." + "接受信息为:" + message);
break;
default:
System.out.println("指定等级不存在!");
}
}
上面是一个非常简单的日志实现。但是这样有个问题,当我需要增加其他的日志等级的时候,我需要更改上面的代码,增加多一个日志等级的 case
,还有一些其他的修改。这样将会违反了“开闭原则”,相当于每次新增的功能都需要进行修改和测试,这样并不利于扩展和维护。
所以,责任链模式就可以体现出来了。
✨ 代码
下面我将以日志的例子进行示例。
抽象类
public abstract class AbstractLogger {
public static int INFO = 1;
public static int WARN = 2;
public static int ERROR = 3;
protected Integer level;
private AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger logger) {
this.nextLogger = logger;
}
public void logMessage(int level, String message) {
if (this.level == level) {
write(message);
}
if (this.nextLogger != null) {
this.nextLogger.logMessage(level, message);
}
}
protected abstract void write(String message);
}
InfoLogger.java
public class InfoLogger extends AbstractLogger {
public InfoLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("等级是 : info");
System.out.println(message);
}
}
WarnLogger.java
public class WarnLogger extends AbstractLogger {
public WarnLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("等级是 : warn");
System.out.println(message);
}
}
ErrorLogger.java
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level) {
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("等级是 : error");
System.out.println(message);
}
}
测试类
public class Test {
public static void main(String[] args) {
ErrorLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
InfoLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
WarnLogger warnLogger = new WarnLogger(AbstractLogger.WARN);
infoLogger.setNextLogger(warnLogger);
warnLogger.setNextLogger(errorLogger);
AbstractLogger chain = infoLogger;
chain.logMessage(1, "INFO 信息");
chain.logMessage(2, "WARN 信息");
chain.logMessage(3, "ERROR 信息");
}
}
✨ 优点
- 发送者和接受者解耦
✨ 缺点
- 可能信息会在责任链上中断,难以无法追踪
- 不注重维护,可能会导致循环调用