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

yizhihongxing

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

相关文章

  • C#怎么实现手机短信发送功能

    为了实现C#语言中的手机短信发送功能,我们需要使用短信接口提供商的服务。以下是一些实现方法的步骤: 步骤一:选择一个短信接口提供商 首先,我们需要选择并注册一个短信接口提供商。常见的短信接口提供商有阿里云、腾讯云、云片等。注册后,我们可以得到一些必要的信息,例如接口地址、账号、密码。 步骤二:调用短信接口 接着,我们需要使用HTTP协议来调用短信接口。我们可…

    Java 2023年5月19日
    00
  • Java经典面试题汇总:Spring Boot

    关于Java经典面试题汇总:Spring Boot的完整攻略,我一方面可以介绍一些常见的Spring Boot面试题,另一方面也可以分享一些解决这些问题的方法和技巧。 Spring Boot常见面试题目 以下是一些常见的Spring Boot面试题目,你可以参考或练习它们: 1. Spring Boot的自动配置原理是什么? 2. Spring Boot如何…

    Java 2023年5月15日
    00
  • java时间段查询将00:00:00更换成23:59:59

    针对Java时间段查询将00:00:00更换成23:59:59的问题,我可以提供以下攻略: 方法一:使用时间处理类 在Java中,可以使用Java提供的时间处理类来实现将时间段的起始时间和结束时间从00:00:00和23:59:59的时间戳互相转换,具体实现步骤如下: 首先,定义起始时间和结束时间的字符串,如下所示: String startTimeStr …

    Java 2023年5月20日
    00
  • 详解Java如何使用集合来实现一个客户信息管理系统

    详解Java如何使用集合来实现一个客户信息管理系统 1. 概述 在Java中,可以使用集合类来实现一个简单的客户信息管理系统。集合类提供了丰富的数据结构和操作方法,能够满足各种需求。 我们可以使用List或Set来存储客户信息,在程序中实现增删改查等操作。同时,我们可以利用Map来存储客户信息,实现键值对的存储,方便以后的查找和遍历。 2. 使用List实现…

    Java 2023年5月30日
    00
  • Spring使用xml方式整合第三方框架流程详解

    Spring框架是一个非常流行的Java框架,通过使用Spring框架,我们可以更加容易地开发和管理Java应用程序。它提供了各种功能和模块,使得我们可以使用各种第三方框架和库来构建复杂的应用程序。同时,Spring框架也提供了与第三方框架的整合工具,以简化整合流程。 本文将主要介绍如何使用Spring的xml方式来整合第三方框架的流程和步骤。 引入第三方框…

    Java 2023年5月19日
    00
  • Java运用SWT插件编写桌面记事本应用程序

    Java运用SWT插件编写桌面记事本应用程序 简介 SWT(Standard Widget Toolkit)是一种Java库,它提供了一组本地GUI控件,使开发者可以使用本地的GUI控件制作图形用户界面。SWT的特点是高效和快速响应,可以充分利用本地操作系统的GUI库。 本篇攻略将详细介绍如何使用SWT插件编写一个桌面记事本应用程序。 步骤 步骤一:准备SW…

    Java 2023年5月23日
    00
  • java 易懂易用的MD5加密(可直接运行)(2)

    下面是完整的攻略: Java易懂易用的MD5加密(可直接运行)(2) 背景信息 本篇攻略是 “Java易懂易用的MD5加密(可直接运行)(1)” 的续篇,如需了解更多背景信息请先查阅前篇攻略。 攻略步骤 1. 导入依赖包 首先,我们需要先导入依赖包。在本篇攻略中,我们使用的是commons-codec依赖包,该包中包含了Java中常用的摘要算法、编码器和哈希…

    Java 2023年6月15日
    00
  • 如何用Java Stream写出既高雅又装*的代码

    如何用Java Stream写出既高雅又装*的代码? Java Stream可以被用来解决很多问题,从简单的过滤到复杂的组合操作。它极大地减少了编写的代码量,提高了代码的可读性、可维护性和可重用性。 下面是一些使用Java Stream的技巧,可以让你写出高雅又装*的代码。 1. 使用Lambda表达式写过滤器 传统的Java代码需要明确指定每一步操作的细节…

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