1. 程式人生 > >Java設計模式—職責鏈模式(Chain of Responsibility)

Java設計模式—職責鏈模式(Chain of Responsibility)

目錄

目的

應用例項

程式碼 


 

  • 目的

避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將他們連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理為止。

  • 應用例項

  1. 職責鏈上的處理者負責處理請求,客戶只需要將請求傳送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞。
  2. Servlet的過濾器Fileter。
  • 程式碼 

package com.gary.pattern.chain;

/**
 * describe:抽象記錄器類
 *
 * @author gary
 * @date 2018/12/23
 */
public abstract class AbstractLogger {
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;

    protected int level;
    protected AbstractLogger nextLogger;

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

    public void logMessage(int level, String message) {
        if (level >= this.level) {
            write(message);
        }
        if (nextLogger != null) {
            nextLogger.logMessage(level, message);
        }
    }

    abstract public void write(String message);
}
package com.gary.pattern.chain;

/**
 * describe:記錄器類的實現類
 *
 * @author gary
 * @date 2018/12/23
 */
public class ErrorLogger extends AbstractLogger {

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


    @Override
    public void write(String message) {
        System.out.println("ErrorLogger:" + message);
    }
}
package com.gary.pattern.chain;

/**
 * describe:記錄器類的實現類
 *
 * @author gary
 * @date 2018/12/23
 */
public class DebugLogger extends AbstractLogger {

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


    @Override
    public void write(String message) {
        System.out.println("DebugLogger:" + message);
    }
}
package com.gary.pattern.chain;

/**
 * describe:記錄器類的實現類
 *
 * @author gary
 * @date 2018/12/23
 */
public class ConsoleLogger extends AbstractLogger {

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


    @Override
    public void write(String message) {
        System.out.println("ConsoleLogger:" + message);
    }
}
package com.gary.pattern.chain;

/**
 * describe:記錄器鏈測試Demo
 *
 * @author gary
 * @date 2018/12/23
 */
public class ChainDemo {

    /**
     * 建立不同型別的記錄器,賦予不同級別,並每個記錄器設定下一個記錄器。
     *
     */
    private static AbstractLogger getChainOfLoggers() {
        return new ErrorLogger(AbstractLogger.ERROR)
            .setNextLogger(new DebugLogger(AbstractLogger.DEBUG)
            .setNextLogger(new ConsoleLogger(AbstractLogger.INFO)));
    }

    public static void main(String[] args) {

        AbstractLogger chainOfLogger = getChainOfLoggers();

        chainOfLogger.logMessage(AbstractLogger.INFO, "This is an info information");

        chainOfLogger.logMessage(AbstractLogger.DEBUG, "This is an dubug information");

        chainOfLogger.logMessage(AbstractLogger.ERROR, "This is an error information");
    }
}

ConsoleLogger:This is an info information
DebugLogger:This is an dubug information
ConsoleLogger:This is an dubug information
ErrorLogger:This is an error information
DebugLogger:This is an error information
ConsoleLogger:This is an error information

Process finished with exit code 0