深入了解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日

相关文章

  • 详解springmvc控制登录用户session失效后跳转登录页面

    下面我将详细讲解“详解SpringMVC控制登录用户Session失效后跳转登录页面”的完整攻略,包括具体步骤和示例说明: 背景 在Web应用中,通常会对用户进行登录验证,并在登录成功后将用户的登录状态保存在Session中,当用户操作时,需要检查Session是否过期或失效,若失效或过期需要重新登录。 实现步骤 1. 配置web.xml文件 在web.xm…

    Java 2023年6月16日
    00
  • springData使用QueryDsl的示例代码

    让我来详细讲解一下“Spring Data 使用 Querydsl 的示例代码”的完整攻略。 简介 Querydsl 是一个基于 Java 类型化查询的框架,使得编写类型安全、易于理解的查询变得容易。 Spring Data 是 Spring 框架的一部分,通过提供抽象化的数据存储层来简化对数据访问的开发。Spring Data Querydsl 是 Spr…

    Java 2023年5月20日
    00
  • Java数组添加元素实例

    下面是详细讲解”Java数组添加元素实例”的完整攻略: 1. 数组概述 Java中的数组是一种简单的数据结构,用于存储相同类型的数据。数组是一个连续的存储空间,其每个元素的内存地址是相邻的,所以可以通过索引来访问数组中的元素。 2. 数组添加元素的方法 Java中的数组是固定长度的,一旦创建后其长度就无法改变。因此,在需要添加元素的情况下,我们需要重新创建一…

    Java 2023年5月26日
    00
  • 如何在Java中实现一个散列表

    散列表(Hash Table)是一种以键值对结构存储数据的数据结构,它可以高效地实现插入、删除和查找操作。在Java中,我们可以使用HashMap来实现一个散列表。 下面是实现一个散列表的步骤: 定义一个HashMap对象 在Java中,我们可以使用HashMap来实现散列表。因此,首先要定义一个HashMap对象。我们可以使用以下语法: HashMap&l…

    Java 2023年5月19日
    00
  • Java 日期格式加上指定月数(一个期限)得到一个新日期的实现代码

    首先,我们需要使用Java的日期时间API中的”LocalDate”类。这个类用于表示日期,我们可以使用它来进行日期间的加减操作。 接下来,我们可以使用”plusMonths”方法来添加指定月数。该方法会返回一个新的日期对象,表示在原日期对象基础上加上指定月数的日期。 以下是实现代码: import java.time.LocalDate; public c…

    Java 2023年5月20日
    00
  • 在JavaScript中调用Java类和接口的方法

    在JavaScript中调用Java类和接口的方法,一般需要通过Java的JavaScript引擎来实现。下面,我们将详细介绍调用Java类和接口方法的完整攻略。 步骤一:创建Java类和接口 为了在JavaScript中调用Java类和接口的方法,我们首先需要创建相应的Java类和接口。这里以Java类Calculator和Java接口Greeting为例…

    Java 2023年5月26日
    00
  • java Gui实现肯德基点餐收银系统

    Java Gui实现肯德基点餐收银系统 1. 简介 本攻略旨在介绍如何使用Java Gui实现肯德基点餐收银系统。 2. 技术框架 本文使用如下技术框架: Java: JDK 1.8及以上版本 Swing: Java的GUI组件库 Eclipse: Java开发IDE 3. 实现步骤 3.1. 搭建开发环境 首先,需要在计算机上安装JDK和Eclipse。 …

    Java 2023年5月30日
    00
  • Eclipse+Java+Swing+Mysql实现工资管理系统

    Eclipse+Java+Swing+Mysql实现工资管理系统攻略 1. 系统概述 工资管理系统是企业内部薪资管理的重要组成部分,其任务是集中管理员工的薪资及相关信息。本系统采用Eclipse+Java+Swing+Mysql技术实现,具备以下功能模块: 登录模块:提供登录界面,验证用户身份。 员工信息管理:添加、删除员工及修改员工信息。 薪资管理:计算、…

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