责任链 (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.
登录后复制
- 第一个请求已通过所有处理程序成功处理,证明整个链按预期工作。
- 第二个请求在授权步骤期间失败,停止进一步处理并防止无效请求到达业务逻辑。
责任链模式的好处
关注点分离:每个处理程序都有不同的职责,使代码更易于理解和维护。这种分离使团队能够专注于请求处理的特定方面,而不必担心整个工作流程。
灵活的请求处理:可以在不改变现有逻辑的情况下添加或删除处理程序,从而可以轻松适应新的需求或业务规则的变化。这种模块化支持敏捷开发实践。
提高可维护性:处理程序的解耦性质意味着一个处理程序中的更改(例如更新验证逻辑)不会影响其他处理程序,从而最大限度地降低了向系统引入错误的风险。
更轻松的测试:可以单独测试各个处理程序,从而简化测试过程。这允许有针对性的单元测试和更直接地调试特定请求处理步骤。
缺点
性能开销:长链处理程序可能会带来延迟,特别是在需要顺序执行许多检查的情况下。在性能关键型应用程序中,这可能会成为一个问题。
流程控制的复杂性:虽然该模式简化了各个处理程序的职责,但它可能会使请求处理的整体流程变得复杂。了解如何通过多个处理程序处理请求可能需要新团队成员提供额外的文档和精力。
结论
责任链模式是后端开发中的一种有效设计模式,它通过促进关注点分离、灵活性和可维护性来增强请求处理。通过实现这种请求验证和处理模式,开发人员可以创建能够有效处理各种需求的强大且可扩展的系统。无论是在 restful api、中间件处理还是其他后端应用程序中,采用 cor 模式都可以带来更简洁的代码和改进的架构设计,最终带来更可靠和可维护的软件解决方案。
以上就是理解后端开发中的责任链设计模式的详细内容,更多请关注抖狐科技其它相关文章!
-
支付宝怎么取消芒果TV会员自动续费
如何取消支付宝芒果tv会员自动续费?步骤:打开支付宝点击“我的”点击“全部服务”在“会员中心”中找到“芒果tv会员”点击“管理”点击“到期时间”下方的“自动续费”开关将开关切换到“关闭”状态支付宝取消...
-
旅游攻略小红书运营技巧
针对小红书运营,可采取以下七项技巧:明确目标受众打造优质内容(引人注目的图片和标题,有趣有用的文字,高品质的图片和视频)优化笔记(关键词,标签,封面图片)与粉丝互动(回复评论,举办活动,创建社区)利用...
-
作业帮怎么设置不自动续费
可以通过以下步骤关闭作业帮自动续费:登录账户,进入“我的”页面,选择“免密支付”,关闭“自动续费”开关。关闭后,不会再自动收取会员费,但当前周期结束前会员资格继续有效。如何关闭作业帮的自动续费 步骤...
-
传索尼 Xperia 生产线迁往印度 放弃东莞
近日,有媒体发布消息称,索尼公司正考虑将 xperia 智能手机的生产线从当前位置转移至印度,以加强其在该地区的市场竞争力并扩大市场份额。回顾索尼 xperia 智能手机的制造历程,其生产基地曾从中国...
-
王者营地陪伴怎么开启
想知道王者营地陪伴模式如何开启吗?php小编苹果为你准备了详细的开通教程,让你轻松开启陪伴模式,享受游戏中的互动乐趣。请继续阅读以下文章,了解开启王者营地陪伴模式的步骤和注意事项。 王者营地陪伴怎么开...