深入浅出职责链模式

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 深入浅出职责链模式

深入浅出职责链模式

简介

      职责链模式在面向对象程式设计里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。

     责任链模式涉及到的角色如下所示:

● **抽象处理者(Handler)角色:**定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

● **具体处理者(ConcreteHandler)角色:**具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

场景说明

  • 批假条
  • 处理日志

在这里我们就代码实现下日志处理中的职责链模式:

假设一个事件需要进行日志处理,一共有Info、Warning、Error三个等级,每个等级都有相应的日志记录功能,记录日志时需要从低到高进行记录,首先要进行Info级别的记录,如果需要Error级别的日志则无法处理,所以需要高级别的日志记录器进行记录。

代码实现

BaseLogger.java

/**
 * @desc: 抽象职责处理类
 * @author: YanMingXin
 * @create: 2021/8/14-22:11
 **/
public abstract class BaseLogger {
    private BaseLogger logger;
    protected final String INFO_LEVEL = "info";
    protected final String WARNING_LEVEL = "warning";
    protected final String ERROR_LEVEL = "error";
    public BaseLogger getLogger() {
        return logger;
    }
    public void setLogger(BaseLogger logger) {
        this.logger = logger;
    }
    /**
     * 输出信息
     *
     * @param logLevel
     */
    public abstract void loggerMessage(String logLevel);
}

ErrorLogger.java

/**
 * @desc: Error具体处理类
 * @author: YanMingXin
 * @create: 2021/8/14-22:12
 **/
public class ErrorLogger extends BaseLogger {
    @Override
    public void loggerMessage(String logLevel) {
        if (ERROR_LEVEL.equals(logLevel)) {
            System.out.println("error level log ......");
        } else {
            getLogger().loggerMessage(logLevel);
        }
    }
}

InfoLogger.java

/**
 * @desc: Info具体处理类
 * @author: YanMingXin
 * @create: 2021/8/14-22:11
 **/
public class InfoLogger extends BaseLogger {
    @Override
    public void loggerMessage(String logLevel) {
        if (INFO_LEVEL.equals(logLevel)) {
            System.out.println("info level log ......");
        } else {
            getLogger().loggerMessage(logLevel);
        }
    }
}

WarningLogger.java

/**
 * @desc: Warning具体处理类
 * @author: YanMingXin
 * @create: 2021/8/14-22:12
 **/
public class WarningLogger extends BaseLogger{
    @Override
    public void loggerMessage(String logLevel) {
        if (WARNING_LEVEL.equals(logLevel)) {
            System.out.println("warning level log ......");
        } else {
            getLogger().loggerMessage(logLevel);
        }
    }
}

CorModelTest.java

/**
 * @desc: 职责链模式(责任链模式)测试类
 * @author: YanMingXin
 * @create: 2021/8/14-21:58
 **/
public class CorModelTest {
    public static void main(String[] args) {
        InfoLogger infoLogger = new InfoLogger();
        WarningLogger warningLogger = new WarningLogger();
        ErrorLogger errorLogger = new ErrorLogger();
        //生成职责链
        infoLogger.setLogger(warningLogger);
        warningLogger.setLogger(errorLogger);
        infoLogger.loggerMessage("error");
        infoLogger.loggerMessage("info");
        infoLogger.loggerMessage("warning");
    }
}

测试结果:


相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
存储 大数据 数据处理
PHP 与大数据:构建高效数据处理系统
传统的数据处理系统往往难以应对大规模数据的处理需求,而PHP作为一种常用的服务器端脚本语言,在数据处理方面也有其独特的优势。本文将探讨如何利用PHP构建高效的大数据处理系统,结合实际案例分析其应用场景及优势所在。
336 28
|
11月前
|
算法 测试技术 定位技术
数据结构与算法——DFS(深度优先搜索)
数据结构与算法——DFS(深度优先搜索)
|
SQL 分布式计算 DataWorks
MaxCompute最佳实践:SQL实现一行变多行&多行变一行
本文对Dataworks里一行变多行&多行变一行进行实践,其中多行变一行是对现有实践的一个引用,方便大家查找
|
11月前
|
编解码 移动开发 HTML5
简要描述多媒体的格式都有哪些
【10月更文挑战第5天】简要描述多媒体的格式都有哪些。
179 3
|
11月前
|
消息中间件 存储 监控
RocketMQ消息重试机制解析!
RocketMQ消息重试机制解析!
727 1
RocketMQ消息重试机制解析!
|
XML Android开发 数据格式
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
本文通过案例分析了在Android中当两个Activity都设置了`android.intent.category.LAUNCHER`类别时,会导致它们同时在应用启动器的"所有应用"页面显示为不同的启动入口。
355 2
android中两个Activity同时设定了intent-filter的category为android.intent.category.LAUNCHER,会发生什么情况?
|
前端开发
HTML网页作业代码(仿写商城首页、学校官网网页等、源码可直接运行)
这篇文章提供了HTML网页作业的完整代码,包括仿写商城首页和学校官网网页的源码,以及如何运行和项目结构等详细信息。
HTML网页作业代码(仿写商城首页、学校官网网页等、源码可直接运行)
|
12月前
|
负载均衡 前端开发 应用服务中间件
前后端分离技术与NGINX的简单使用
前后端分离技术与NGINX的简单使用
158 2
|
11月前
|
机器学习/深度学习 自然语言处理
交叉熵损失
【10月更文挑战第2天】
|
存储 传感器 人工智能
AliOS Things 系统架构介绍(一)
AliOS Things 系统架构介绍(一)
640 0