设计模式—责任链模式

这篇具有很好参考价值的文章主要介绍了设计模式—责任链模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、待解决问题: 减少代码中 if else 语句,降低代码圈复杂度或深度,增强可读性。
1、需求背景: 采购订单创建,需要验证采购员、物料、供应商、供应商的银行账号等信息。如采购员权限到期、或供应商失效等问题,都无法下单。
2、代码如下:

public class PurchaseOrderHandler {
    public boolean isBuyerPermissionSupport(PurchaseOrderEntity orderEntity) {
    }

    public boolean isSupplierValid(PurchaseOrderEntity orderEntity) {
    }

    public boolean isItemAllowed(PurchaseOrderEntity orderEntity) {
    }

    public boolean isSupplierBankAccountValid((PurchaseOrderEntity orderEntity) {
    }

    public String createPurchaseOrder(PurchaseOrderEntity orderEntity) {
        if (!isBuyerPermissionSupport(orderEntity)) {
            return "buyer has no permission";
        }
        if (!isItemAllowed(orderEntity)) {
            return "item is not allowed";
        }
        if (!isSupplierValid(orderEntity)) {
            return "supplier is not valid";
        }
        if (!isSupplierBankAccountValid(orderEntity)) {
            return "supplier bank account is not valid";
        }
        /**
         * 创建逻辑省略。。。。。。
         */
        return "create Success";
    }
}

学习使用责任链模式后优化:

public abstract class Handler {
    public Handler successor;

    public abstract boolean isValid(PurchaseOrderEntity orderEntity);

    public void setSuccessor(Handler handler) {
        successor = handler;
    }
}

public class BuyerHandler extends Handler{
    @Override
    public boolean isValid(PurchaseOrderEntity orderEntity) {
        if ("xxxBuyer".equals(orderEntity.getBuyer())) {
            return false;
        } else {
            return successor.isValid(orderEntity);
        }
    }
}

public class ItemHandler extends Handler{
    @Override
    public boolean isValid(PurchaseOrderEntity orderEntity) {
        if ("xxxxItem".equals(orderEntity.getItem())) {
            return false;
        } else {
            return successor.isValid(orderEntity);
        }
    }
}
/**省略供应商和供应商银行账号的校验类 **/

public class PurchaseOrderHandler {
    public String createPurchaserOrder(PurchaseOrderEntity orderEntity) {
        Handler buyerHandler = new BuyerHandler();
        Handler itemHandler = new ItemHandler();
        Handler supplierHandler = new SupplierHandler();
        Handler supplierBankAccountHandler = new SupplierBankAccountHandler();
        Handler lastHandler = new SupplierHandler();
        buyerHandler.setSuccessor(itemHandler);
        itemHandler.setSuccessor(supplierHandler);
        supplierHandler.setSuccessor(supplierBankAccountHandler);
        supplierBankAccountHandler.setSuccessor(lastHandler);

        if (!buyerHandler.isValid(orderEntity)) {
            return "purchase order create error.";
        }
        return "create Success";
    }
 }

3、分析:使用责任链模式,将整体的校验流程和具体校验点逻辑实现分离,但是每增加一个校验点,就要新增一个实现类。

二、责任链模式:
为避免发送者与多个请求处理者耦合在一起,将所有的请求处理者通过前一对象记住其下一个对象的引用而连城一条链。当请求发生时,可将请求沿着这条链传递,直接有对象处理它为止。

备注:从这个概念看,责任链模式主要用于解决为请求找到合适的处理对象。经典案例是请假问题,如请假3天组长审批,5天项目经理审批,7天部长审批。组长、项目经理、部长属于不同的对象。

1、主要角色:
抽象处理者(handler):包含处理请求的接口、抽象处理方法和后继节点。
具体处理者(Concrete handler):继承实现抽象处理者并实现请求的接口。可以处理请求则处理,不能处理则转给后继节点。
客户端角色(client):创建处理链,并向具体的处理对象提交请求。
类图:
设计模式—责任链模式
2、优点:
1、减低对象之间的耦合度。
2、增强系统的可扩展性,满足开闭原则。
3、简化了处理对象的链接,避免过多的 if else 语句。
4、责任分担。每个类只处理自己的逻辑,明确责任范围,符合类的单一职责原则。
3、缺点:
1、每个处理对象要创建一个类,造成类过多。
2、使用客户端角色创建责任链。如果责任链的继任者设置错误,可能造成循环调用。
3、当责任链过长,请求处理涉及多个处理对象,无法使用并发,系统性能受到影响。

三、实际项目感悟:
1、责任链模式主要用于解决为请求找到合适的处理对象。本文中的案例使用责任链解决校验逻辑多造成的 if else 语句过多问题,可能并不是一个好的主意。因为这样造成了过多的类对象,并且不相关校验逻辑不能使用并发校验。这种场景需要找到一个更合适的方案解决。
2、责任链会使代码增多。

学习自B站课程: https://www.bilibili.com/video/BV1Np4y1z7BU?p=105文章来源地址https://www.toymoban.com/news/detail-497936.html

到了这里,关于设计模式—责任链模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式—责任链模式

    一、待解决问题 : 减少代码中 if else 语句,降低代码圈复杂度或深度,增强可读性。 1、需求背景: 采购订单创建,需要验证采购员、物料、供应商、供应商的银行账号等信息。如采购员权限到期、或供应商失效等问题,都无法下单。 2、代码如下: 学习使用责任链模式后

    2024年02月10日
    浏览(42)
  • 设计模式:责任链模式

    责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理该请求为止。责任链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,同时避免了请求发送者与接收者之间的直接耦合关系。 在

    2024年02月07日
    浏览(41)
  • 设计模式-责任链模式

    遇到一个面试的场景题目,让实现税率的计算 请使用Java语言实现如下税率计算: 1~5000 税率 0 5001~8000 3% 8001~17000 10% 17001~30000 20% 30001~40000 25% 40001~60000 30% 60001~85000 35% 85001~ 45% 要求 ⅰ. 逻辑正确,代码优雅 ⅱ. 可扩展性,考虑区间的变化,比如说起征点从5000变成10000等等,或者

    2024年02月11日
    浏览(33)
  • 面试设计模式-责任链模式

    在进行请假申请,财务报销申请,需要走部门领导审批,技术总监审批,大领导审批等判断环节。存在请求方和接收方耦合性太强,代码会比较臃肿,不利于扩展和维护。 针对上面,使用责任链模式,将请求方和接收方的业务进行解耦, 客户端发送一个请求,由一个抽象的

    2024年02月09日
    浏览(40)
  • 设计模式——22. 责任链模式

    责任链模式是一种行为设计模式,它允许你创建一个对象链,每个对象都包含了请求的一部分处理逻辑,并且请求按照链的顺序依次传递,直到有一个对象处理它为止。责任链模式通常用于将一个请求从发送者传递给多个接收者,直到有一个接收者处理请求为止。 责任链模式

    2024年02月07日
    浏览(36)
  • 说说设计模式~责任链模式

    回到目录 它是一种设计模块,主要将操作流程与具体操作解耦,让每个操作都可以设置自己的操作流程,这对于工作流应用是一个不错的选择! 下面是官方标准的定义:责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一

    2024年02月11日
    浏览(36)
  • 设计模式07-责任链模式

    责任链模式属于行为设计模式,常见的过滤器链就是使用责任链模式设计的。 Q:假设有一个闯关游戏,共三关,每一关达到通过条件后才能进入下一关,使用java实现。 A:针对这个问题,按照朴素的想法,我们可以定义三个类,分别是第一关、第二关、第三关,客户端启动

    2024年02月16日
    浏览(39)
  • 设计模式详解-责任链模式

    类型:行为型模式 实现原理:为请求创建了一个接收者对象的链。对请求的发送者和接收者进行解耦,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 作用:避免请求发送者与接收者耦合在一

    2024年02月12日
    浏览(37)
  • 设计模式之责任链模式

    责任链设计模式是一种行为设计模式,它允许你创建一个对象链。请求从链的一端进入,并沿着链的路径依次经过各个对象,直至找到合适的处理者。每个对象都决定是否要处理该请求或将其传递给链中的下一个对象。 1.1 核心概念 Handler(处理者):每个处理者对象包含了处

    2024年02月05日
    浏览(44)
  • 重温设计模式 --- 责任链模式

    责任链模式 是一种行为型设计模式,它通过一条由多个处理器组成的链来处理请求,每个处理器都有机会处理请求,如果一个处理器不能处理该请求,它会将请求传递给下一个处理器,直到请求被处理为止。 在实际应用中,责任链模式常用于处理请求的分发、事件处理等场

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包