zoukankan      html  css  js  c++  java
  • 14 【行为型】责任链模式理解与使用~

    责任链模式

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

    灵魂画师~ 走你

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

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

    例子2

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

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

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

    代码理解

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

    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

  • 相关阅读:
    蓝桥杯--算法训练 区间k大数查询
    vijos1782:借教室
    vijos1779国王游戏
    C++大数模板
    HDU1042(N!:设4为基数)
    HDU1026(延时迷宫:BFS+优先队列)
    POJ3984(迷宫问题)
    HDU3018:Ant Trip(欧拉回路)
    HDU5438:Ponds(拓扑排序)
    2008北航:字符串匹配
  • 原文地址:https://www.cnblogs.com/ChromeT/p/11785596.html
Copyright © 2011-2022 走看看