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

    一、概述

    责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。【行为型模式】

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

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

    解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

    场景:在处理消息的时候以过滤很多道。

    二、使用

    代码:

    package pattern.chain;
    
    public class ChainPatternDemo {
        // 创建不同类型的记录器。赋予它们不同的错误级别,并在每个记录器中设置下一个记录器。
        // 每个记录器中的下一个记录器代表的是链的一部分。
        private static AbstractLogger getChainOfLoggers() {
            // error记录器 -> 错误日志
            AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
            // debug记录器 -> debug日志
            AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
            // info记录器 -> info日志
            AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
    
            errorLogger.setNextLogger(fileLogger);
            fileLogger.setNextLogger(consoleLogger);
    
            return errorLogger;
        }
    
        public static void main(String[] args) {
            AbstractLogger loggerChain = getChainOfLoggers();
            // 记录 小于等于 info级别
            loggerChain.logMessage(AbstractLogger.INFO, "info 级别");
            System.out.println();
    
            // 记录 小于等于 debug级别
            loggerChain.logMessage(AbstractLogger.DEBUG, "debug 级别");
            System.out.println();
    
            // 记录 小于等于 error级别
            loggerChain.logMessage(AbstractLogger.ERROR, "error 级别");
        }
    }
    
    // 创建抽象的记录器类
    abstract class AbstractLogger {
        public static int INFO = 1;
        public static int DEBUG = 2;
        public static int ERROR = 3;
    
        protected int level;
    
        //责任链中的下一个元素
        protected AbstractLogger nextLogger;
    
        public void setNextLogger(AbstractLogger nextLogger) {
            this.nextLogger = nextLogger;
        }
    
        public void logMessage(int level, String message) {
            if (this.level >= level) {
                write(message);
            }
            if (nextLogger != null) {
                nextLogger.logMessage(level, message);
            }
        }
    
        abstract protected void write(String message);
    }
    
    // 创建扩展了该记录器类的实体类。
    class ConsoleLogger extends AbstractLogger {
        public ConsoleLogger(int level) {
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("控制台打印: " + message);
        }
    }
    
    class ErrorLogger extends AbstractLogger {
        public ErrorLogger(int level) {
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("错误打印: " + message);
        }
    }
    
    
    class FileLogger extends AbstractLogger {
        public FileLogger(int level) {
            this.level = level;
        }
    
        @Override
        protected void write(String message) {
            System.out.println("文件打印: " + message);
        }
    }

    运行结果:

    错误打印: info 级别
    文件打印: info 级别
    控制台打印: info 级别

    错误打印: debug 级别
    文件打印: debug 级别

    错误打印: error 级别

    参考:设计模式之责任链模式

  • 相关阅读:
    统计nginx日志里访问次数最多的前十个IP
    while 格式化输出 运算符 字符编码
    Python 软件安装
    Python 基础
    Typora 基础的使用方法
    Django ORM (四) annotate,F,Q 查询
    Django 惰性机制
    Django ORM (三) 查询,删除,更新操作
    Django ORM (二) 增加操作
    Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  • 原文地址:https://www.cnblogs.com/shiyun32/p/13993115.html
Copyright © 2011-2022 走看看