设计模式_责任链模式

模式:行为型模式

在我们开发的过程中,常常会遇到有些框架或者小工具使用了责任链这个设计模式。
例如说,日志工具或 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 信息");
    }
}

✨ 优点

  1. 发送者和接受者解耦

✨ 缺点

  1. 可能信息会在责任链上中断,难以无法追踪
  2. 不注重维护,可能会导致循环调用

posted on 2019-05-06 10:59  野区杰西  阅读(111)  评论(0编辑  收藏  举报

导航