(十 六)趣学设计模式 之 责任链模式!

目录

    • [一、 啥是责任链模式?](#一、 啥是责任链模式?)
    • [二、 为什么要用责任链模式?](#二、 为什么要用责任链模式?)
    • [三、 责任链模式的实现方式](#三、 责任链模式的实现方式)
    • [四、 责任链模式的优缺点](#四、 责任链模式的优缺点)
    • [五、 责任链模式的应用场景](#五、 责任链模式的应用场景)
    • [六、 总结](#六、 总结)

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解命令模式请看: (十 五)趣学设计模式 之 命令模式!
✨更多请看个人主页: 码熔burning

一、 啥是责任链模式?

想象一下,一场激烈的足球比赛 ⚽️。 当球传到你脚下时,你需要判断自己是否能够处理这个球:如果可以,就自己处理;如果不行,就将球传给下一个队友。 球就这样在队员之间传递,直到有人能够处理它。

责任链模式,就是用来解决请求的发送者和多个接收者之间耦合的问题! 它可以将多个处理器组成一条链,并将请求沿着链传递,直到某个处理器能够处理它 🎁。

简单来说,就是把请求像踢皮球一样,在多个处理器之间传递,直到有人能搞定!

  • 你需要处理一个请求,但是不知道哪个处理器能够处理它: 就像你需要将球传给最合适的队友 ⚽️!
  • 你需要动态地添加和删除处理器: 就像你需要根据比赛情况调整球员的位置 🏃!
  • 你需要保证请求一定会被处理: 就像你需要保证球最终会被踢进球门 🥅!

二、 为什么要用责任链模式?

用责任链模式,好处多多 👍:

  • 解耦请求和处理: 请求的发送者不需要知道哪个处理器能够处理它,只需要将请求发送到链上 🤝!
  • 灵活添加和删除处理器: 可以动态地添加和删除处理器,使得代码更加灵活 🤸!
  • 简化代码: 避免大量的 if-else 语句,使得代码更加简洁优雅 💫!
  • 提高代码的可维护性: 将每个处理器的逻辑封装起来,使得代码更加清晰易懂 💡!

三、 责任链模式的实现方式

责任链模式主要包含三个核心概念:

  • 抽象处理者(Handler): 定义了处理请求的接口,并持有下一个处理者的引用 🤝!
  • 具体处理者(ConcreteHandler): 实现了抽象处理者的接口,负责处理特定的请求 ⚙️!
  • 客户端(Client): 创建责任链,并将请求发送到链上 🏭!
java 复制代码
// 抽象处理者:审批人
public abstract class Approver {
    protected Approver nextApprover; // 下一个审批人

    public void setNextApprover(Approver nextApprover) {
        this.nextApprover = nextApprover;
    }

    public abstract void approve(int amount); // 审批请求
}

// 具体处理者:主任
public class Director extends Approver {
    @Override
    public void approve(int amount) {
        if (amount <= 1000) {
            System.out.println("主任批准了 " + amount + " 元的报销");
        } else {
            if (nextApprover != null) {
                nextApprover.approve(amount); // 传递给下一个审批人
            } else {
                System.out.println("金额太大,无法批准");
            }
        }
    }
}

// 具体处理者:经理
public class Manager extends Approver {
    @Override
    public void approve(int amount) {
        if (amount <= 5000) {
            System.out.println("经理批准了 " + amount + " 元的报销");
        } else {
            if (nextApprover != null) {
                nextApprover.approve(amount); // 传递给下一个审批人
            } else {
                System.out.println("金额太大,无法批准");
            }
        }
    }
}

// 具体处理者:总经理
public class CEO extends Approver {
    @Override
    public void approve(int amount) {
        System.out.println("总经理批准了 " + amount + " 元的报销");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        // 创建审批人
        Director director = new Director();
        Manager manager = new Manager();
        CEO ceo = new CEO();

        // 设置责任链
        director.setNextApprover(manager);
        manager.setNextApprover(ceo);

        // 发起报销请求
        director.approve(500); // 主任批准
        director.approve(2000); // 经理批准
        director.approve(6000); // 总经理批准
    }
}

代码解释

  • Approver 类是抽象处理者,定义了 approve 方法和 setNextApprover 方法。
  • Director 类、Manager 类和 CEO 类是具体处理者,实现了 approve 方法,负责处理特定金额的报销请求。
  • Client 类是客户端,负责创建责任链,并将报销请求发送到链上。

输出结果

主任批准了 500 元的报销
经理批准了 2000 元的报销
总经理批准了 6000 元的报销

四、 责任链模式的优缺点

优点:

  • 解耦请求和处理 🤝!
  • 灵活添加和删除处理器 🤸!
  • 简化代码 💫!
  • 提高代码的可维护性 💡!

缺点:

  • 请求可能无法被处理 😫!
  • 调试困难 🤯!

五、 责任链模式的应用场景

  • 审批流程: 报销审批、请假审批等等 📝!
  • 事件处理: 鼠标点击、键盘输入等等 🖱️⌨️!
  • 过滤器: 敏感词过滤、恶意请求过滤等等 🛡️!
  • 异常处理: 捕获和处理异常 🚨!

六、 总结

  • 责任链模式就像踢皮球,你不行我上! ⚽️
  • 核心概念包括抽象处理者、具体处理者和客户端! 🔑
  • 优点是解耦请求和处理、灵活添加和删除处理器、简化代码、提高代码的可维护性! 👍
  • 缺点是请求可能无法被处理、调试困难! 👎
  • 适用于需要将请求传递给多个处理器,直到有人能够处理它的场景! 🎯

希望这篇文章能让你彻底理解责任链模式! 💯 祝你学习愉快! 😄

相关推荐
没有十八岁15 分钟前
云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书
java·数据库·spring·汽车
小萌新上大分42 分钟前
Minio搭建并在SpringBoot中使用完成用户头像的上传
java·spring boot·后端·minio·minio搭建·头像上传·minio入门
B站计算机毕业设计超人1 小时前
计算机毕业设计SpringBoot+Vue.js校园失物招领系统(源码+文档+PPT+讲解)
java·vue.js·spring boot·后端·毕业设计·课程设计·毕设
计算机-秋大田1 小时前
基于SpringBoot的环保网站的设计与实现(源码+SQL脚本+LW+部署讲解等)
java·vue.js·spring boot·后端·课程设计
汤姆yu1 小时前
基于springboot的高校物品捐赠系统
java·spring boot·后端·高校物品捐赠
magic 2451 小时前
深入理解Java网络编程:从基础到高级应用
java·开发语言
岁岁岁平安1 小时前
spring注解开发(Spring整合JUnit+MyBatis)(7)
java·spring·junit·log4j·mybatis
剑海风云2 小时前
JVM常用概念之垃圾回收设计与停顿
java·开发语言·jvm
Nicole Potter2 小时前
游戏中的成就系统,我们一般会使用设计模式中的哪种模式来制作?为什么?
游戏·设计模式·面试·c#
顾随2 小时前
(一)Java虚拟机——JVM的组成
java·开发语言·jvm