• 责任链模式:职责的传递与处理


    欢迎阅读设计模式系列的第十四篇文章,今天我们将深入探讨责任链模式,这是一种非常有用的行为型设计模式。责任链模式用于将请求沿着处理者链传递,直到找到能够处理请求的对象为止。

    什么是责任链模式?

    责任链模式是一种行为型设计模式,旨在构建一个处理请求的对象链。每个对象都有机会处理请求,但如果它无法处理,请求将继续传递到链上的下一个对象,直到找到一个能够处理请求的对象。

    责任链模式通常包括以下角色:

    1. 抽象处理者(Handler):定义了处理请求的接口,通常包含一个指向下一个处理者的引用。
    2. 具体处理者(Concrete Handler):实现了处理请求的方法,如果能够处理请求就处理,否则将请求传递给下一个处理者。
    3. 客户端(Client):创建并向处理者链提交请求。

    为什么需要责任链模式?

    责任链模式有助于降低发送者和接收者之间的耦合度。它允许您动态地建立处理者链,根据需要修改链的顺序或添加新的处理者,而无需更改客户端代码。

    责任链模式还有助于减少代码重复。如果有多个处理者需要执行相似的操作,您可以将这些操作提取到一个共享的父类中,以避免重复编码。

    责任链模式的实现

    让我们通过一个简单的示例来说明责任链模式的实现。假设我们正在构建一个支持不同支付方式的系统,包括支付宝、微信支付和银行卡支付。

    首先,我们定义一个抽象处理者 PaymentHandler,它包含一个指向下一个处理者的引用和一个处理请求的抽象方法:

    public abstract class PaymentHandler {
        protected PaymentHandler nextHandler;
    
        public void setNextHandler(PaymentHandler nextHandler) {
            this.nextHandler = nextHandler;
        }
    
        public abstract void handlePayment(String paymentType);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    接下来,我们创建具体处理者,例如 AlipayHandlerWechatPayHandlerBankCardHandler,它们实现了 handlePayment 方法,如果能够处理支付请求,则处理;否则,将请求传递给下一个处理者。

    public class AlipayHandler extends PaymentHandler {
        public void handlePayment(String paymentType) {
            if ("Alipay".equals(paymentType)) {
                System.out.println("使用支付宝支付成功");
            } else {
                if (nextHandler != null) {
                    nextHandler.handlePayment(paymentType);
                } else {
                    System.out.println("无法处理支付请求");
                }
            }
        }
    }
    
    // 类似地实现 WechatPayHandler 和 BankCardHandler
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    最后,客户端创建处理者链并提交支付请求:

    public class Client {
        public static void main(String[] args) {
            PaymentHandler alipayHandler = new AlipayHandler();
            PaymentHandler wechatPayHandler = new WechatPayHandler();
            PaymentHandler bankCardHandler = new BankCardHandler();
    
            alipayHandler.setNextHandler(wechatPayHandler);
            wechatPayHandler.setNextHandler(bankCardHandler);
    
            alipayHandler.handlePayment("WechatPay"); // 输出:使用微信支付成功
            alipayHandler.handlePayment("BankCard");  // 输出:使用银行卡支付成功
            alipayHandler.handlePayment("ApplePay");  // 输出:无法处理支付请求
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在上述示例中,支付请求首先由 AlipayHandler 处理,如果无法处理,则传递给下一个处理者,直到找到能够处理的处理者或到达链的末尾。

    最佳实践

    在使用责任链模式时,有一些最佳实践可以帮助您提高代码的可维护性和可扩展性:

    1. 链的顺序:仔细选择责任链中处理者的顺序,确保请求能够被正确处理。通常,具体处理者应按照它们的处理能力从弱到强的顺序排列。
    2. 避免死循环:在实现处理者链时,确保不会出现无限循环的情况,这可能会导致应用程序崩溃。
    3. 默认处理者:为了避免请求到达链的末尾仍无法处理的情况,可以在责任链的末尾添加一个默认处理者,用于处理未被其他处理者处理的请求。

    总结

    责任链模式是一种有助于构建灵活、松耦合系统的设计模式。它将请求发送者与接收者解耦,允许多个对象都有机会处理请求,直到找到一个合适的处理者。责任链模式在处理请求流程中非常有用,如请求过滤、身份验证、日志记录等方面。

  • 相关阅读:
    北方工业大学计算机考研资料汇总
    Tronapi-波场接口-源码无加密-可二开--附接口文档-基于ThinkPHP5封装-作者详细指导-2022年7月1日08:43:06
    优思学院|如何应用六西格玛的DMAIC做好采购管理?
    SAP-ABAP-RFC类型接口创建步骤
    发布Android库至Maven Central详解
    速卖通、lazada卖家怎么利用自养号测评让店铺排名靠前?
    十七、文件(1)
    锐捷——Telnet登陆时使用密码登陆路由器
    风光储一体化园区 | 图扑新能源可视化
    还原回收站的文件需要管理员权限怎么办
  • 原文地址:https://blog.csdn.net/weixin_45701550/article/details/132793199