0

0

理解后端开发中的责任链设计模式

碧海醫心

碧海醫心

发布时间:2024-10-29 13:36:10

|

1087人浏览过

|

来源于dev.to

转载

理解后端开发中的责任链设计模式

责任链 (cor) 设计模式是一种强大的行为模式,可以显着增强后端开发。此模式允许您通过处理程序链传递请求,其中每个处理程序可以处理请求或将其传递到下一个处理程序。在本博客中,我们将从后端角度探讨 cor 模式,特别关注其在 web 服务中的请求验证和处理中的应用,并使用 java 作为示例。

何时使用责任链模式

责任链模式在后端系统中特别有用,其中请求可能需要多个验证和处理步骤才能最终确定。例如,在 restful api 中,传入请求在由主要业务逻辑处理之前可能需要验证身份验证、授权和数据完整性。这些问题中的每一个都可以由链中的不同处理程序来处理,从而允许明确分离职责和模块化代码。这种模式在中间件架构中也很有用,其中不同的中间件组件可以处理请求,从而实现基于特定标准的灵活处理。

责任链模式的结构

cor 模式由三个关键组件组成:处理程序、具体处理程序和客户端。 handler 定义处理请求的接口并维护对链中下一个处理程序的引用。每个具体处理程序实现特定类型请求处理的逻辑,决定是处理请求还是将其传递给下一个处理程序。 client 将请求发送到处理程序链,但不知道哪个处理程序将最终处理该请求。这种解耦提高了后端系统的可维护性和灵活性。

java 实现示例

第 1 步:定义处理程序接口

首先,我们将定义一个 requesthandler 接口,其中包含设置下一个处理程序和处理请求的方法:

abstract class requesthandler {
    protected requesthandler nexthandler;

    public void setnext(requesthandler nexthandler) {
        this.nexthandler = nexthandler;
    }

    public void handlerequest(request request) {
        if (nexthandler != null) {
            nexthandler.handlerequest(request);
        }
    }
}

第 2 步:创建具体处理程序

接下来,我们将创建扩展 requesthandler 类的具体处理程序类,每个类负责请求处理的特定方面:

class authenticationhandler extends requesthandler {
    @override
    public void handlerequest(request request) {
        if (request.isauthenticated()) {
            system.out.println("authentication successful.");
            super.handlerequest(request);
        } else {
            system.out.println("authentication failed.");
            request.setvalid(false);
        }
    }
}

class authorizationhandler extends requesthandler {
    @override
    public void handlerequest(request request) {
        if (request.isauthorized()) {
            system.out.println("authorization successful.");
            super.handlerequest(request);
        } else {
            system.out.println("authorization failed.");
            request.setvalid(false);
        }
    }
}

class datavalidationhandler extends requesthandler {
    @override
    public void handlerequest(request request) {
        if (request.isdatavalid()) {
            system.out.println("data validation successful.");
            super.handlerequest(request);
        } else {
            system.out.println("data validation failed.");
            request.setvalid(false);
        }
    }
}

class businesslogichandler extends requesthandler {
    @override
    public void handlerequest(request request) {
        if (request.isvalid()) {
            system.out.println("processing business logic...");
            // perform the main business logic here
        } else {
            system.out.println("request is invalid. cannot process business logic.");
        }
    }
}

第 3 步:设置链条

现在,我们将根据处理程序的职责来设置处理程序链:

public class requestprocessor {
    private requesthandler chain;

    public requestprocessor() {
        // create handlers
        requesthandler authhandler = new authenticationhandler();
        requesthandler authzhandler = new authorizationhandler();
        requesthandler validationhandler = new datavalidationhandler();
        requesthandler logichandler = new businesslogichandler();

        // set up the chain
        authhandler.setnext(authzhandler);
        authzhandler.setnext(validationhandler);
        validationhandler.setnext(logichandler);

        this.chain = authhandler; // start of the chain
    }

    public void processrequest(request request) {
        chain.handlerequest(request);
    }
}

第四步:客户端代码

以下是客户端代码与请求处理链交互的方式:

public class main {
    public static void main(string[] args) {
        requestprocessor processor = new requestprocessor();

        // simulating a valid request
        request validrequest = new request(true, true, true);
        processor.processrequest(validrequest);

        // simulating an invalid request
        request invalidrequest = new request(true, false, true);
        processor.processrequest(invalidrequest);
    }
}

支援班

这是一个简单的 request 类,用于封装请求数据:

class request {
    private boolean authenticated;
    private boolean authorized;
    private boolean datavalid;
    private boolean valid = true;

    public request(boolean authenticated, boolean authorized, boolean datavalid) {
        this.authenticated = authenticated;
        this.authorized = authorized;
        this.datavalid = datavalid;
    }

    public boolean isauthenticated() {
        return authenticated;
    }

    public boolean isauthorized() {
        return authorized;
    }

    public boolean isdatavalid() {
        return datavalid;
    }

    public boolean isvalid() {
        return valid;
    }

    public void setvalid(boolean valid) {
        this.valid = valid;
    }
}

输出说明

当您运行客户端代码时,您将观察到以下输出:

ShopWind网店系统
ShopWind网店系统

ShopWind网店系统是国内最专业的网店程序之一,采用ASP语言设计开发,速度快、性能好、安全性高。ShopWind网店购物系统提供性化的后台管理界面,标准的网上商店管理模式和强大的网店软件后台管理功能。ShopWind网店系统提供了灵活强大的模板机制,内置多套免费精美模板,同时可在后台任意更换,让您即刻快速建立不同的网店外观。同时您可以对网模板自定义设计,建立个性化网店形象。ShopWind网

下载
Authentication successful.
Authorization successful.
Data validation successful.
Processing business logic...
Authentication successful.
Authorization failed.
Request is invalid. Cannot process business logic.
  • 第一个请求已通过所有处理程序成功处理,证明整个链按预期工作。
  • 第二个请求在授权步骤期间失败,停止进一步处理并防止无效请求到达业务逻辑。

责任链模式的好处

  1. 关注点分离:每个处理程序都有不同的职责,使代码更易于理解和维护。这种分离使团队能够专注于请求处理的特定方面,而不必担心整个工作流程。

  2. 灵活的请求处理:可以在不改变现有逻辑的情况下添加或删除处理程序,从而可以轻松适应新的需求或业务规则的变化。这种模块化支持敏捷开发实践。

  3. 提高可维护性:处理程序的解耦性质意味着一个处理程序中的更改(例如更新验证逻辑)不会影响其他处理程序,从而最大限度地降低了向系统引入错误的风险。

  4. 更轻松的测试:可以单独测试各个处理程序,从而简化测试过程。这允许有针对性的单元测试和更直接地调试特定请求处理步骤。

缺点

  1. 性能开销:长链处理程序可能会带来延迟,特别是在需要顺序执行许多检查的情况下。在性能关键型应用程序中,这可能会成为一个问题。

  2. 流程控制的复杂性:虽然该模式简化了各个处理程序的职责,但它可能会使请求处理的整体流程变得复杂。了解如何通过多个处理程序处理请求可能需要新团队成员提供额外的文档和精力。

结论

责任链模式是后端开发中的一种有效设计模式,它通过促进关注点分离、灵活性和可维护性来增强请求处理。通过实现这种请求验证和处理模式,开发人员可以创建能够有效处理各种需求的强大且可扩展的系统。无论是在 restful api、中间件处理还是其他后端应用程序中,采用 cor 模式都可以带来更简洁的代码和改进的架构设计,最终带来更可靠和可维护的软件解决方案。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

845

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

745

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

740

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

420

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

447

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16947

2023.08.03

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

41

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号