当前位置: 首页 > article >正文

【Java设计模式】责任链模式:构建强大的请求处理机制

文章目录

  • 【Java设计模式】责任链模式:构建强大的请求处理机制
    • 一、概述
    • 二、责任链设计模式的别名
    • 三、责任链设计模式的意图
    • 四、责任链模式的详细解释及实际示例
    • 五、Java中责任链模式的编程示例
    • 六、责任链模式类图
    • 七、何时在Java中使用责任链模式
    • 八、责任链模式在Java中的实际应用
    • 九、责任链模式的优点和权衡
    • 十、源码下载

【Java设计模式】责任链模式:构建强大的请求处理机制

一、概述

在Java开发中,责任链模式是一种重要的行为设计模式,它可以解耦请求的发送者和接收者,使多个对象都有机会处理请求。本文将详细介绍责任链模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还将提供示例代码的下载链接,方便读者进行学习和实践。

二、责任链设计模式的别名

  • Chain of Command(命令链)
  • Chain of Objects(对象链)
  • Responsibility Chain(责任链)

三、责任链设计模式的意图

Java中的责任链模式是一种行为设计模式,它通过给予多个对象处理请求的机会,将请求的发送者与接收者解耦。接收对象被链接成链,请求沿着链传递,直到有对象处理它。

四、责任链模式的详细解释及实际示例

  1. 实际示例
    • Java中责任链模式的一个现实世界示例是技术支持呼叫中心。在实现这个Java设计模式时,每个级别的支持都代表链中的一个处理程序。当客户打电话进来提出问题时,呼叫首先由一线支持代表接收。如果问题简单,代表直接处理它。如果问题更复杂,代表将呼叫转发给二级支持技术人员。这个过程继续,呼叫通过多个支持级别升级,直到到达能够解决问题的专家。每个级别的支持都代表链中的一个处理程序,呼叫沿着链传递,直到找到合适的处理程序,从而将请求与特定的接收者解耦。
  2. 通俗解释
    • 它有助于构建一个对象链。请求从一端进入,从一个对象传递到另一个对象,直到找到合适的处理程序。
  3. 维基百科解释
    • 在面向对象设计中,责任链模式是一种由命令对象源和一系列处理对象组成的设计模式。每个处理对象包含定义它可以处理的命令对象类型的逻辑;其余的命令对象被传递到链中的下一个处理对象。

五、Java中责任链模式的编程示例

在这个Java示例中,兽人国王下达命令,这些命令由代表责任链模式的指挥链进行处理。通过以下代码片段学习如何在Java中实现这种设计模式。
兽人国王大声向他的军队下达命令。最接近的指挥官首先做出反应,然后是军官,然后是士兵。指挥官、军官和士兵形成了一条责任链。
首先,我们有Request类:

@Getter
public class Request {
    private final RequestType requestType;
    private final String requestDescription;
    private boolean handled;
    public Request(final RequestType requestType, final String requestDescription) {
        this.requestType = Objects.requireNonNull(requestType);
        this.requestDescription = Objects.requireNonNull(requestDescription);
    }
    public void markHandled() {
        this.handled = true;
    }
    @Override
    public String toString() {
        return getRequestDescription();
    }
}
public enum RequestType {
    DEFEND_CASTLE, TORTURE_PRISONER, COLLECT_TAX
}

接下来,我们展示RequestHandler层次结构。

public interface RequestHandler {
    boolean canHandleRequest(Request req);
    int getPriority();
    void handle(Request req);
    String name();
}
@Slf4j
public class OrcCommander implements RequestHandler {
    @Override
    public boolean canHandleRequest(Request req) {
        return req.getRequestType() == RequestType.DEFEND_CASTLE;
    }
    @Override
    public int getPriority() {
        return 2;
    }
    @Override
    public void handle(Request req) {
        req.markHandled();
        LOGGER.info("{} handling request \"{}\"", name(), req);
    }
    @Override
    public String name() {
        return "Orc commander";
    }
}
// OrcOfficer和OrcSoldier的定义与OrcCommander类似...

兽人国王下达命令并形成链。

public class OrcKing {
    private List<RequestHandler> handlers;
    public OrcKing() {
        buildChain();
    }
    private void buildChain() {
        handlers = Arrays.asList(new OrcCommander(), new OrcOfficer(), new OrcSoldier());
    }
    public void makeRequest(Request req) {
        handlers
              .stream()
              .sorted(Comparator.comparing(RequestHandler::getPriority))
              .filter(handler -> handler.canHandleRequest(req))
              .findFirst()
              .ifPresent(handler -> handler.handle(req));
    }
}

责任链的实际应用。

  public static void main(String[] args) {
    var king = new OrcKing();
    king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle"));
    king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner"));
    king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax"));
}

控制台输出:

Orc commander handling request "defend castle"
Orc officer handling request "torture prisoner"
Orc soldier handling request "collect tax"

六、责任链模式类图

在这里插入图片描述

七、何时在Java中使用责任链模式

当出现以下情况时使用责任链模式:

  1. 多个对象可能处理请求,并且处理程序事先不知道。处理程序应该自动确定。
  2. 您希望向多个对象中的一个发出请求,而无需明确指定接收者。
  3. 能够处理请求的对象集应该动态指定。

八、责任链模式在Java中的实际应用

  1. GUI框架中的事件冒泡,其中事件可能在UI组件层次结构的多个级别上处理。
  2. 中间件框架,其中请求通过一系列处理对象传递。
  3. 日志框架,其中消息可以通过一系列记录器传递,每个记录器可能以不同的方式处理它们。
  4. java.util.logging.Logger#log()
  5. Apache Commons Chain
  6. javax.servlet.Filter#doFilter()

九、责任链模式的优点和权衡

优点:

  1. 减少耦合。请求的发送者不需要知道将处理请求的具体处理程序。
  2. 在分配对象的责任时增加了灵活性。您可以通过更改链的成员和顺序来添加或更改处理请求的责任。
  3. 允许您设置默认处理程序,如果没有具体处理程序可以处理请求。

权衡:

  1. 调试和理解流程可能具有挑战性,特别是如果链很长且复杂。
  2. 如果链不包括捕获所有情况的处理程序,请求可能最终未被处理。
  3. 由于可能在找到正确的处理程序之前经过多个处理程序,或者根本找不到,可能会出现性能问题。

十、源码下载

责任链模式示例代码下载

通过本文的介绍,相信大家对Java中的责任链模式有了更深入的了解。在实际开发中,合理运用责任链模式可以提高系统的灵活性和可扩展性,同时降低模块之间的耦合度。


http://www.kler.cn/a/284851.html

相关文章:

  • 时间管理的三个痛点
  • WPF学习之路,控件的只读、是否可以、是否可见属性控制
  • 项目集章程program charter
  • Spring框架之观察者模式 (Observer Pattern)
  • IPguard与Ping32全面对比——选择最适合企业的数据安全解决方案
  • k8s集群安装(kubeadm)
  • 技术成神之路:设计模式(十二)模板方法模式
  • SQL存储过程:数据库编程的瑞士军刀
  • Java中的注解(Annotation)
  • 谷粒商城实战笔记-269~271-商城业务-订单服务-bug修改
  • Python3遍历文件夹下的文件
  • AI编码新时代:免费人工智能助手Blackbox AI
  • Spring Boot 集成 JdbcTemplate(盘它!)
  • 使用WSL在Windows上安装Linux
  • 【微信小程序】SpringBoot集成微信小程序(多小程序集成)
  • opencv/c++的一些简单的操作(入门)
  • 趣味算法------多重背包问题
  • 【拉取Git项目到本地,知识小记,后续再改】
  • EmguCV学习笔记 VB.Net 8.1 漫水填充法 floodFill
  • volatile 关键字
  • Mac 安装Hadoop教程
  • 【算法每日一练及解题思路】计算以空格隔开的字符串的最后一个单词的长度
  • Linux - 如何在 Linux 中使用`find` 命令
  • JAVA安全之Velocity模板注入刨析
  • 字和字节的区别?
  • 分享两个方法分析python打包exe