责任链模式

​ ​ 责任链模式给请求创建了一个由接收者对象组成的链,基于请求的类型对请求的发送方和接收方进行解耦。每个接收者都包含对另一个接收者的引用,如果不能处理该请求,则把请求转发给下一个接收者继续处理。拦截的类都要实现统一的接口。责任链模式的具体应用包括Java Web中的过滤器链、js中的事件冒泡。
​ ​ 责任链模式的优点是降低耦合度,将请求的发送者和接收者解耦;简化了对象,对象不需要知道责任链的结构;增加新的请求处理类很方便。
​ ​ 责任链模式的缺点是不能 保证请求一定被接收;系统性能会受影响,可能会造成循环调用。
​ ​ 使用责任链模式实现日志打印:

  1. 创建抽象类,记录日志级别;
public abstract class AbstractLogger {
    static int INFO = 1;
    static int DEBUG = 2;
    static int ERROR = 3;
    int level;
    AbstractLogger nextLogger;

    //设置包含的下一个日志级别
    void setNextLogger(AbstractLogger nextLogger){
        this.nextLogger = nextLogger;
    }

    //实现日志输出
    void logMessage(int level, String message){
        if(this.level <= level){
            write(message);
        }

        if(nextLogger != null){
            nextLogger.logMessage(level, message);
        }
    }

    //给子类扩展使用
    protected abstract void write(String message);
}
  1. 创建不同级别的日志;
/**
 * 控制台
 */
public class ConsoleLogger extends AbstractLogger {

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

    @Override
    protected void write(String message) {
        System.out.println("Standard Console::Logger:" + message);
    }
}

/*
 * 文件
 */
public class FileLogger extends AbstractLogger {

    FileLogger(int level){
        this.level = level;
    }

    @Override
    protected void write(String message) {
        System.out.println("File::Logger:" + message);
    }
}

/*
 * 错误
 */
public class ErrorLogger extends AbstractLogger {

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

    @Override
    protected void write(String message) {
        System.out.println("Error::Logger:" + message);
    }
}
  1. 设置责任链顺序,创建启动类。
public class LoggerChainInstance {
	//责任链顺序:console -> file -> error
    private static AbstractLogger getChainOfLoggers(){
        AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
        AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
        fileLogger.setNextLogger(consoleLogger);
        errorLogger.setNextLogger(fileLogger);
        return errorLogger;
    }

    public static void main(String[] args) {
        AbstractLogger logger = getChainOfLoggers();
        logger.logMessage(AbstractLogger.ERROR, "This is an information.");
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐江小鱼

知识创造财富,期待您的慷慨解囊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值