当前位置:首页 > 文章列表 > 文章 > java教程 > 理解后端开发中的责任链设计模式

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

来源:dev.to 2024-11-02 13:37:05 0浏览 收藏

从现在开始,努力学习吧!本文《理解后端开发中的责任链设计模式》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

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

责任链 (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;
    }
}

输出说明

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

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 模式都可以带来更简洁的代码和改进的架构设计,最终带来更可靠和可维护的软件解决方案。

到这里,我们也就讲完了《理解后端开发中的责任链设计模式》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

版本声明
本文转载于:dev.to 如有侵犯,请联系study_golang@163.com删除
在 Vue 中,如何在父子组件间传递 Map 变量并避免 \在 Vue 中,如何在父子组件间传递 Map 变量并避免 \"TypeError: Cannot read properties of undefined (reading \'get\')\" 错误?
上一篇
在 Vue 中,如何在父子组件间传递 Map 变量并避免 \"TypeError: Cannot read properties of undefined (reading \'get\')\" 错误?
中文输入法引号输入难题:如何轻松指定上引号或下引号?
下一篇
中文输入法引号输入难题:如何轻松指定上引号或下引号?
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    508次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    497次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • 笔灵AI生成答辩PPT:高效制作学术与职场PPT的利器
    笔灵AI生成答辩PPT
    探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
    20次使用
  • 知网AIGC检测服务系统:精准识别学术文本中的AI生成内容
    知网AIGC检测服务系统
    知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
    29次使用
  • AIGC检测服务:AIbiye助力确保论文原创性
    AIGC检测-Aibiye
    AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
    35次使用
  • 易笔AI论文平台:快速生成高质量学术论文的利器
    易笔AI论文
    易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
    43次使用
  • 笔启AI论文写作平台:多类型论文生成与多语言支持
    笔启AI论文写作平台
    笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
    36次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码