责任链模式-Chain of Responsibility Pattern

纵饮孤独 提交于 2020-01-19 19:18:59

        责任链模式(Chain of Responsiblity Pattern) 为这种请求创建了一个接受者的链。这种模式给予请求的类型

这种模式给予请求的类型 对请求的发送者和接受者进行解偶。 这种类型的设计模式属于行为模式。

       在这种模式中,通常每个接受者都包含对另一个接受者的引用 如果一个对象不能处理该请求  那么它会把相同的请求传递给下一个请求。 

       意图:避免请求发送者与接受者耦合在一起,让多个对象有可能接受请求将这些连成一条链,并且沿着这条链传递请求,直到有对象处理为值。 

      下面是demo.

package com.royan.weakey.platform.pattern.chainResponsibility;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * 责任链模式(Chain of Responsibility Pattern)
 * 为请求创建了一个接受者对象的链。这种模式给予请求的类型
 * 这种模式给予请求的类型 对请求的发送者和接受者进行解偶。
 * 这种类型的设计模式属于行为模式
 * <p>
 * 在这种模式中,通常每个接受者都包含对另一个接受者的引用
 * 如果一个对象不能处理该请求 那么它会把相同的请求下一个接收者
 * <p>
 * 意图:避免请求发送者与接受者耦合在一起,让多个对象有可能接受请求
 * 将这些连成一条链,并且沿着这条链传递请求  直到有对象处理它为止。
 */
@Slf4j
@Data
public abstract class
AbstractLogger {
    enum LogLevel {
        INFO(1),
        DEBUG(2),
        ERROR(3);
        private int code;

        LogLevel(int code) {
            this.code = code;
        }

        private int getCode() {
            return code;
        }
    }

    public AbstractLogger(LogLevel logLevel) {
        this.logLevel = logLevel;
    }

    private LogLevel logLevel;
    protected AbstractLogger nextLogger;


    public void logMessage(LogLevel level, String message) {
        if (this.logLevel.getCode() <= level.getCode())
            write(message);
        if (nextLogger != null)
            nextLogger.logMessage(level, message);
    }

    abstract protected void write(String message);


}
package com.royan.weakey.platform.pattern.chainResponsibility;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ErrorLogger extends AbstractLogger {

    public ErrorLogger(LogLevel logLevel) {
        super(logLevel);
    }

    @Override
    protected void write(String message) {
        log.info("Error Console::Logger-{}", message);
    }
}
package com.royan.weakey.platform.pattern.chainResponsibility;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class FileLogger extends AbstractLogger {

    public FileLogger(LogLevel logLevel) {
        super(logLevel);
    }

    @Override
    protected void write(String message) {
        log.info("File::Logger-{}", message);
    }
}
package com.royan.weakey.platform.pattern.chainResponsibility;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;


@Slf4j
public class ConsoleLogger extends AbstractLogger {

    public ConsoleLogger(LogLevel logLevel) {
        super(logLevel);
    }

    @Override
    protected void write(String message) {
        log.info("Standard Console::Logger-{}", message);
    }


}
package com.royan.weakey.platform.pattern.chainResponsibility;

public class ChainPatternDemo {
    private static AbstractLogger getChainOfLoggers() {
        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.LogLevel.ERROR);
        AbstractLogger fileLogger = new FileLogger(AbstractLogger.LogLevel.DEBUG);
        AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.LogLevel.INFO);
        errorLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);
        return errorLogger;
    }


    public static void main(String[] args) {
        AbstractLogger loggerChain = getChainOfLoggers();
        loggerChain.logMessage(AbstractLogger.LogLevel.INFO, "This is an info information");
        loggerChain.logMessage(AbstractLogger.LogLevel.DEBUG, "This is a debug level information.");
        loggerChain.logMessage(AbstractLogger.LogLevel.ERROR, "This is an error information.");
    }

}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!