14 【行为型】责任链模式理解与使用~

责任链模式

通俗的讲,就好比将所有要处理的对象链接再一条链子上,如果这个对象不能处理,就传递到下一个对象,依次传递,完成请求的转发与处理。

 

灵魂画师~ 走你

这里用要给漏斗过滤的原理在说明责任链,就好比漏斗的每一层都有一层过滤膜,不同大小的球体进入这个过滤层之后,通过不同的滤网,直到小球无法通过被隔离在上面

,这就好比责任链模式,小球就是一个个请求对象,要是小球的直径小于滤孔,则无法被捕捉处理,只能通过,交给下级处理,直到有滤网可以处理,才停留下来。

 

 

 

例子2

log4j的日志系统是JAVA里面常用的日志,这里只常用四个,从DEBUG开始,到ERROR,

设置不同的日志等级,就会打印出不同的日志,就好比ERROR日志等级只会打印出错误相关的事情,

而DEBUG就会打印出所有信息,这里就按照这个类型来举例子

 

 

代码理解

定义一个抽象类,定义出DEBUG\INFO\ERROR 等错误等级的标识以及定义打印日志的方法,

public abstract class AbstractLogger {

    public  int DEBUG = 1;

    public  int INTO = 2;

    public  int ERROR = 3;

    protected int level;

    protected AbstractLogger nextLogger;


    public void logMessage(int level,String message){

        if (this.level <= level) {
            this.log(message);
        }

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

    }

    public abstract void log(String message);

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


}

 

Console 日志等级为一级,作为最低一级,它的下一级等级为INFO 

public class ConsoleLogger extends AbstractLogger {

    ConsoleLogger(){
        this.level = DEBUG;
        setNextLogger(new FileLogger());
    }

    @Override
    public void log(String message) {
        System.out.println("console log:"+message);
    }
}

FileLogger 日志等级为2,INFO日志等级。它的下一级为ErrorLogger

public class FileLogger extends AbstractLogger {

    FileLogger(){
        this.level = INTO;
        this.setNextLogger(new ErrorLogger());
    }

    @Override
    public void log(String message) {
        System.out.println("fileLogger:"+message);
    }
}

//最后一级Error作为等级最高的以及,它没有下级了,所以传递一个Null

public class ErrorLogger extends AbstractLogger {

    public ErrorLogger(){
        this.level = ERROR;
        this.setNextLogger(null);
    }

    @Override
    public void log(String message) {
        System.out.println("errorLogger:"+message);
    }
}

测试方法,这里只需要暴露出最低级的ConsoleLogger 即可,然后传递不同类型的错误信息和等级

    public static void main(String[] args) {

        AbstractLogger logger = new ConsoleLogger();

        logger.logMessage(3,"错误信息");

        System.out.println();

        logger.logMessage(2,"发生了错误");
        System.out.println();

        logger.logMessage(1,"控制台信息");

    }

 

就好比使用Debug 类型错误打印的时候,出现一个Error类型的错误,它都会被输入,但是用Debug类型来处理一个1急别Debug类型,

只会出现一层,不会出现到下一层的Info 一样的道理。

 

 

 

参考:https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html

码云:https://gitee.com/mrc1999/23GOF

 

 

posted @ 2019-11-03 11:52  程序猿小码  阅读(540)  评论(0编辑  收藏  举报