责任链模式

2021-07-08

 

package backgulf.patterns;

public abstract class AbstractLogger {

    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected  int level;

    private AbstractLogger nextLogger;

    public void setNextLogger(AbstractLogger logger){
        this.nextLogger = logger;
    }

    /**
     * !关键代码
     *  通过 handler里聚合自己(处理者),让一个 客户 和 多个处理者 解耦
     *  但是本来由 客户端决定的调用哪些处理者的逻辑,要交给 链了。
     *
     */
    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);
}

 

package backgulf.patterns;

public class ConsoleLogger extends AbstractLogger{
    public ConsoleLogger(int level){
        this.level = level;
    }
    @Override
    protected void write(String message) {
        System.out.println("in console logger: "+message);
    }
}

 

package backgulf.patterns;

public class ErrorLogger extends AbstractLogger {
    public ErrorLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("in ErrorLogger: "+message);
    }
}

 

 

package backgulf.patterns;

public class FileLogger extends AbstractLogger{

    public FileLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("in FileLogger: "+message);
    }
}

 

 

package backgulf.patterns;

public class Chain {

    /**
     * 创建 链
     * 调用 next的逻辑放在这里合适,达到条件就向下传递,向谁传递前在这里set进去
     */
    private AbstractLogger getTopLogger(){
        ErrorLogger errorLogger = new ErrorLogger(3);
        FileLogger fileLogger = new FileLogger(2);
        ConsoleLogger consoleLogger = new ConsoleLogger(1);
        //如果从小打到大,链头要是小的
        consoleLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(errorLogger);
        return consoleLogger;
//        errorLogger.setNextLogger(fileLogger);
//        fileLogger.setNextLogger(consoleLogger);
//        return errorLogger;
    }

    public static void main(String[] args) {
        //创建责任链,将处理请求发给链头
        AbstractLogger logger = new Chain().getTopLogger();

        logger.logMessage(AbstractLogger.DEBUG,"hello");
    }


}