zoukankan      html  css  js  c++  java
  • 设计模式_责任链模式

    模式:行为型模式

    在我们开发的过程中,常常会遇到有些框架或者小工具使用了责任链这个设计模式。
    例如说,日志工具或 Netty。我们挑日志工具中作为例子。
    在实际开发环境中,日志常常有不同的等级(info/warn/error)输出。
    但是我们该如何规划这个代码的编写。可能有人就说,这个简单,我马上写一个给你。

        /**
         * @param level 日志等级,使用数字来表示
         * @param message 需要输出的日志信息
         * */
        public void log(int level, String message) {
            switch (level) {
                case INFO:
                    System.out.println("日志等级是 :INFO." + "接受信息为:" + message);
                    break;
                case WARN:
                    System.out.println("日志等级是 :WARN." + "接受信息为:" + message);
                    break;
                case ERROR:
                    System.out.println("日志等级是 :ERROR." + "接受信息为:" + message);
                    break;
                default:
                    System.out.println("指定等级不存在!");
            }
        }
    

    上面是一个非常简单的日志实现。但是这样有个问题,当我需要增加其他的日志等级的时候,我需要更改上面的代码,增加多一个日志等级的 case,还有一些其他的修改。这样将会违反了“开闭原则”,相当于每次新增的功能都需要进行修改和测试,这样并不利于扩展和维护。
    所以,责任链模式就可以体现出来了。

    ✨ 代码
    下面我将以日志的例子进行示例。
    抽象类

    public abstract class AbstractLogger {
        public static int INFO = 1;
        public static int WARN = 2;
        public static int ERROR = 3;
    
        protected Integer level;
    
        private AbstractLogger nextLogger;
    
        public void setNextLogger(AbstractLogger logger) {
            this.nextLogger = logger;
        }
    
        public void logMessage(int level, String message) {
            if (this.level == level) {
                write(message);
            }
    
            if (this.nextLogger != null) {
                this.nextLogger.logMessage(level, message);
            }
        }
    
        protected abstract void write(String message);
    }
    

    InfoLogger.java

    public class InfoLogger extends AbstractLogger {
    
    
        public InfoLogger(int level) {
            this.level = level;
        }
        @Override
        protected void write(String message) {
            System.out.println("等级是 : info");
            System.out.println(message);
        }
    }
    
    

    WarnLogger.java

    public class WarnLogger extends AbstractLogger {
    
        public WarnLogger(int level) {
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("等级是 : warn");
            System.out.println(message);
        }
    }
    

    ErrorLogger.java

    public class ErrorLogger extends AbstractLogger {
        public ErrorLogger(int level) {
            this.level = level;
        }
        @Override
        protected void write(String message) {
            System.out.println("等级是 : error");
            System.out.println(message);
    
        }
    }
    

    测试类

    public class Test {
        public static void main(String[] args) {
            ErrorLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
            InfoLogger infoLogger = new InfoLogger(AbstractLogger.INFO);
            WarnLogger warnLogger = new WarnLogger(AbstractLogger.WARN);
    
            infoLogger.setNextLogger(warnLogger);
            warnLogger.setNextLogger(errorLogger);
    
            AbstractLogger chain = infoLogger;
    
            chain.logMessage(1, "INFO 信息");
            chain.logMessage(2, "WARN 信息");
            chain.logMessage(3, "ERROR 信息");
        }
    }
    

    ✨ 优点

    1. 发送者和接受者解耦

    ✨ 缺点

    1. 可能信息会在责任链上中断,难以无法追踪
    2. 不注重维护,可能会导致循环调用
  • 相关阅读:
    TcpClient连接帮助类
    winform中添加管理员权限控制
    textbox中输入email做格式控制
    绑定和非绑定方法
    类的封装、property、多态和多态性
    继承类之点点滴滴
    爬虫日记-正则表达式
    爬虫日记-单元总结
    爬虫日记-最好大学排名实例
    爬虫日记-第一单元总结
  • 原文地址:https://www.cnblogs.com/tjc1996/p/10818373.html
Copyright © 2011-2022 走看看