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