责任链模式

 

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");
}

}