深入了解Java设计模式之职责链模式

深入了解Java设计模式之职责链模式

职责链模式是一种行为型设计模式,它允许你将请求沿着处理者链进行发送,直到其中一个处理者处理该请求。职责链模式常用于请求的处理流程较为复杂,有多个处理器时的情况。

定义

职责链模式为请求创建了一个接受者对象的链,给予请求的类型,对请求的发送者和接收者进行解耦。职责链模式将请求的发送者和接收者分离开来,只要在链上得到处理,就完成了一次请求的处理过程。

适用场景

职责链模式通常用于以下情况:
- 有多个对象可以处理请求,但不确定哪个对象处理
- 想要在不明确请求处理初始点的情况下,将请求的发送者和处理者解耦
- 有多个请求处理者,但不想明确请求接收者的情况下,向所有处理者发出请求

实现方法

职责链模式由多个处理者组成的链。每个处理者都包含处理请求的方法和下一个处理者的引用。如果当前处理者无法处理请求,它将从链上移除并将请求传递给下一个处理者。在请求到达最后一个处理者时,请求将不再被处理。因此,职责链的长度要视情况而定。

职责链模式的组件如下:
- 请求类:定义请求的结构
- 抽象处理者类:定义处理请求的接口和抽象处理方法
- 具体处理者类:实现抽象处理者接口和抽象处理方法,如果能够处理该种请求,则进行处理;否则,将请求转发给下一个处理者。

示例

下面是一个简单的职责链模式示例,如果请求的金额小于一万,则由CEO审批;如果大于等于一万小于一百万,则由CFO审批;如果大于等于一百万,则由BU主管审批。

请求类

请求类定义请求的结构,包括请求类型和请求金额。

public class Request {
    private String type;
    private double amount;

    public Request(String type, double amount) {
        this.type = type;
        this.amount = amount;
    }

    public String getType() {
        return type;
    }

    public double getAmount() {
        return amount;
    }
}

抽象处理者类

抽象处理者类定义处理请求的接口和抽象处理方法,同时持有下一个处理者的引用。

public abstract class Approver {
    protected Approver nextApprover;

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void processRequest(Request request);
}

具体处理者类

具体处理者类实现抽象处理者接口和抽象处理方法,如果能够处理该种请求,则进行处理;否则,将请求转发给下一个处理者。

public class CEO extends Approver {
    @Override
    public void processRequest(Request request) {
        if (request.getType().equals("purchase") && request.getAmount() < 10000) {
            System.out.println("CEO approved the request: " + request.getType() + ", Amount: " + request.getAmount());
        } else if (nextApprover != null) {
            nextApprover.processRequest(request);
        } else {
            System.out.println("No one can handle the request!");
        }
    }
}

public class CFO extends Approver {
    @Override
    public void processRequest(Request request) {
        if (request.getType().equals("purchase") && request.getAmount() >= 10000 && request.getAmount() < 1000000) {
            System.out.println("CFO approved the request: " + request.getType() + ", Amount: " + request.getAmount());
        } else if (nextApprover != null) {
            nextApprover.processRequest(request);
        } else {
            System.out.println("No one can handle the request!");
        }
    }
}

public class BUManager extends Approver {
    @Override
    public void processRequest(Request request) {
        if (request.getType().equals("purchase") && request.getAmount() >= 1000000) {
            System.out.println("BU Manager approved the request: " + request.getType() + ", Amount: " + request.getAmount());
        } else if (nextApprover != null) {
            nextApprover.processRequest(request);
        } else {
            System.out.println("No one can handle the request!");
        }
    }
}

调用示例

下面是一个调用职责链模式的示例:

public class ChainOfResponsibilityExample {
    public static void main(String[] args) {
        Approver ceo = new CEO();
        Approver cfo = new CFO();
        Approver buManager = new BUManager();
        ceo.setNextApprover(cfo);
        cfo.setNextApprover(buManager);

        Request request1 = new Request("purchase", 5000);
        ceo.processRequest(request1);

        Request request2 = new Request("purchase", 50000);
        ceo.processRequest(request2);

        Request request3 = new Request("purchase", 1000000);
        ceo.processRequest(request3);

        Request request4 = new Request("unknown", 1000000);
        ceo.processRequest(request4);
    }
}

输出结果如下:

CEO approved the request: purchase, Amount: 5000.0
CFO approved the request: purchase, Amount: 50000.0
BU Manager approved the request: purchase, Amount: 1000000.0
No one can handle the request!

总结

职责链模式是一种行为型设计模式,它可以创建一个请求处理链,使用了对象之间的链接来逐步递增处理请求,旨在拆分职责,降低耦合度,增加代码的灵活性和可扩展性。职责链模式非常适用于请求的处理流程比较复杂,有多个处理器时的情况。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入了解Java设计模式之职责链模式 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Nginx负载均衡以及动静分离的原理与配置

    Nginx是一个高性能的Web服务器和反向代理服务器,可以用于负载均衡和动静分离。本文将讲解Nginx负载均衡及动静分离的原理和配置方法,内容包括以下几个方面: 负载均衡原理及方法 动静分离原理及方法 Nginx配置示例 1. 负载均衡原理及方法 负载均衡主要用于分摊用户请求到多个服务器上,以提高吞吐量、降低延迟和避免单点故障。Nginx基于反向代理实现负载…

    Java 2023年5月20日
    00
  • Java选择排序法以及实例详解

    Java选择排序法以及实例详解 选择排序是一种简单的排序算法,其基本思想是:每次从待排序的数组中选择最小值,将其放到数组的起始位置,然后从未排序的数组中选择最小值,将其放到已排序部分的下一个位置。依次类推,直到数组排序完成。 选择排序的Java实现 以下是Java实现选择排序的代码: public class SelectionSort { public s…

    Java 2023年5月19日
    00
  • Tomcat 配置与优化方案详解

    Tomcat 配置与优化方案详解 1. 什么是 Tomcat? Tomcat 是一个开源的 Web 应用服务器,它实现了 Java Servlet 和 JavaServer Pages 规范,提供了一个用于开发和运行 Java Web 应用的环境。 2. Tomcat 的配置 2.1. 配置文件 Tomcat 的配置文件分为两类: server.xml:To…

    Java 2023年6月2日
    00
  • java后端合成图片的实现示例

    来讲一讲“Java后端合成图片的实现示例”的攻略吧。 1. 背景与介绍 有时候我们网站需要用户上传图片并合成一张新的图片,这时候就需要使用Java后端来完成图片合成的工作。在本文中,我们将介绍如何使用Java后端来合成图片,以及示例代码的详细实现和说明。 2. 实现步骤 2.1 准备工作 安装Java开发环境 使用Java库合成图片 理解图片的像素和坐标 熟…

    Java 2023年5月19日
    00
  • Java的Struts框架报错“ValidationException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ValidationException”错误。这个错误通常由以下原因之一起: 表单验证失败:如果表单验证失败,则可能会出现此错误。在这种情况下,需要检查表单验证规则以解决此问题。 配置错误:如果配置文件中没有正确配置,则可能会现此错误。在这种情况下,检查文件以解决此问题。 以下是两个实例: 例 1 如果表单验证…

    Java 2023年5月5日
    00
  • 通过实例解析POJO和JavaBean的区别

    首先,我们需要了解POJO和JavaBean的定义和区别。POJO(Plain Old Java Object)是一个简单的Java对象,它通常只包含了一些属性和其对应的getter/setter方法,没有实现任何接口,也不继承任何类。而JavaBean是一种特殊的POJO,它按照JavaBean的标准定义,需要包含空的构造方法、私有属性(通常使用priva…

    Java 2023年6月15日
    00
  • SpringBoot集成tomcat详解实现过程

    Spring Boot集成Tomcat详解实现过程 在Spring Boot中,我们可以使用内嵌的Tomcat服务器来运行我们的应用程序。在本文中,我们将详细讲解Spring Boot集成Tomcat的实现过程,包括如何配置Tomcat、如何使用Tomcat、如何自定义Tomcat等。 配置Tomcat 在Spring Boot中,我们可以使用applica…

    Java 2023年5月15日
    00
  • Spring Boot+Mybatis的整合过程

    Spring Boot和MyBatis是两个非常流行的Java框架,它们可以很好地协同工作。在本攻略中,我们将详细讲解如何将Spring Boot和MyBatis整合,以及如何使用它们来构建一个完整的Web应用程序。 整合过程 1. 添加依赖 首先,我们需要在pom.xml文件中添加Spring Boot和MyBatis的依赖。以下是一个示例: <de…

    Java 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部