设计模式—责任链模式

news/2024/5/19 16:14:47 标签: 设计模式, 责任链模式

一、待解决问题: 减少代码中 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


http://www.niftyadmin.cn/n/459324.html

相关文章

Redis中AOF和RDB

在Redis的持久化中,常使用的两个手段便是AOF和RDB进行持久化。 RDB(Redis DataBase)是Redis的持久化方式之一,在配置文件中,我们可以找到 对Redis进行持久化配置,而RDB在持久化时是怎么样进行工作的呢&…

python自动化办公——读取PPT写入word表格

Python自动化办公——读取PPT内容写入word表格 文章目录 Python自动化办公——读取PPT内容写入word表格一、需求分析二、导入依赖三、代码四、结果及总结 一、需求分析 📖由于我们知识图谱课程需要将课堂小组汇报的PPT总结成word文档,而我觉得一页一页复…

RabbitMQ 消息丢失的场景,如何保证消息不丢失?

一.RabbitMQ消息丢失的三种情况 第一种:生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。 第二种:RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了 第三种…

【计算机网络详解】——软件定义网络SDN(学习笔记)

目录 🕒 1. 概念🕒 2. OpenFlow 协议 🕒 1. 概念 软件定义网络(Software Defined Network,SDN)的概念最早由斯坦福大学的Nick McKeown教授于2009年提出。SDN最初只是学术界讨论的一种新型网络体系结构。SD…

C高级6.24

一、整理grep、find、cut、tar、apt-get、dpkg、ln、ln-s指令 1.grep ----->查找字符串 grep 字符串 文件名 -w:按单词查找 -R:实现递归查找,主要用于路径是目录的情况 -i:不区分大小写 -n:显示行号 grep -w "^ubuntu" /etc/passwd ---->查找以ub…

ChatGPT在媒体与娱乐领域的沉浸式场景:虚拟主持人和创意助手的新应用探索

第一章:引言 在当今数字化时代,人工智能技术在媒体与娱乐领域的应用日益广泛。ChatGPT作为一种先进的自然语言处理模型,具备强大的对话生成能力和创造力,为媒体与娱乐产业带来了新的创意和可能性。本文将探讨ChatGPT在媒体与娱乐…

【Unity之IMGUI】—编译模式下控件可视化及其封装

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

调查问卷Type Form的集成

简介 Typeform是一家制作线上调查问卷的公司。 Muoz 和 David Okuniev两人于2012年创作出一个更加动态、更具交互性的用户调查工具,每次只提一个问题,并且根据用户的回答为其呈现下一个问题,像和朋友间的对话一样,让用户在不知不…