責任鏈模式
責任鏈模式爲請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。
- 優點
- 降低耦合度。它將請求的發送者和接收者解耦;
- 簡化了對象。使得對象不需要知道鏈的結構;
- 增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任;
- 增加新的請求處理類很方便。
- 缺點
- 不能保證請求一定被接收;
- 系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用;
- 可能不容易觀察運行時的特徵,有礙於除錯。
// 記錄器抽象類
public abstract class AbstractLogger {
public static int INFO = 1;
public static int WARN = 2;
public static int ERROR = 3;
protected int level;
//責任鏈中的下一個元素
protected AbstractLogger nextLogger;
public void setNextLogger(AbstractLogger nextLogger){
this.nextLogger = nextLogger;
}
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);
}
// 信息打印器
public class InfoLogger extends AbstractLogger {
public InfoLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("INFO: " + message);
}
}
// 警告打印器
public class WarnLogger extends AbstractLogger {
public WarnLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("WARN: " + message);
}
}
// 錯誤打印器
public class ErrorLogger extends AbstractLogger {
public ErrorLogger(int level){
this.level = level;
}
@Override
protected void write(String message) {
System.out.println("ERROR: " + message);
}
}
// 使用示例
public class Demo {
private static AbstractLogger getChainOfLoggers(){
AbstractLogger infoLogger = new ConsoleLogger(AbstractLogger.INFO);
AbstractLogger warnLogger = new WarnLogger(AbstractLogger.WARN);
AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
errorLogger.setNextLogger(warnLogger);
warnLogger.setNextLogger(infoLogger);
return errorLogger;
}
public static void main(String[] args) {
AbstractLogger loggerChain = getChainOfLoggers();
loggerChain.logMessage(AbstractLogger.INFO, "信息日誌");
loggerChain.logMessage(AbstractLogger.WARN, "警告日誌");
loggerChain.logMessage(AbstractLogger.ERROR, "錯誤日誌");
}
}