Java设计模式之行为型-责任链模式(UML类图+案例分析)

news2024/12/22 16:02:17

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

五、总结


一、基础概念

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。请求会被链上每个处理者处理,直到请求被处理完毕。该模式主要解决的是请求的发送者和多个请求处理者之间建立一条链式的调用关系,以实现请求的逐层解析处理。

二、UML类图

三、角色设计

角色描述
抽象处理者角色定义了请求处理的接口,提供责任传递机制
具体处理者角色实现了抽象处理者的处理方法,对请求进行处理
客户端角色创建处理链,并向链头发送请求,不直接访问处理者

四、案例分析

下面我们利用责任链模式实现一个可扩展的请假审批流程,通过链式传递请求实现请求者和处理者的解耦,不需要知道整个链的结构。

定义了抽象处理者类Handler,里面有一个successor表示下一级处理者,代码如下:

public abstract class Handler {
  protected Handler successor;

  public void setSuccessor(Handler successor) {
    this.successor = successor;
  }

  public abstract void handleRequest(int leaveDays);
}

Manager、Director、Boss继承了Handler,分别代表不同级别的审批人,在每个具体处理者中判断请假天数,如果在权限内就审批通过,否则传给下一级处理者。 

public class Manager extends Handler {
    @Override
    public void handleRequest(int leaveDays) {
        if (leaveDays <= 3) {
            System.out.println("请假" + leaveDays + "天,主管审批通过!");
        } else {
            successor.handleRequest(leaveDays);
        }
    }
}

public class Director extends Handler {
    @Override
    public void handleRequest(int leaveDays) {
        if (leaveDays <= 6) {
            System.out.println("请假" + leaveDays + "天,经理审批通过!");
        } else {
            successor.handleRequest(leaveDays);
        }
    }
}


public class Boss extends Handler {
    @Override
    public void handleRequest(int leaveDays) {
        if (leaveDays <= 10) {
            System.out.println("请假" + leaveDays + "天,老板审批通过!");
        } else {
            System.out.println("请假" + leaveDays + "天,老板审批不通过!");
        }
    }

}

将三个处理者链成一条责任链,并依次发起请假请求,请求会从Manager开始,依次传递到Director和Boss,直到有人审批通过或最终审批不通过。

客户端:

public class Client {

    public static void main(String[] args) {
        //主管
        Handler manager = new Manager();
        //经理
        Handler director = new Director();
        //老板
        Handler boss = new Boss();

        manager.setSuccessor(director);
        director.setSuccessor(boss);

        manager.handleRequest(1);
        manager.handleRequest(4);
        manager.handleRequest(8);
        manager.handleRequest(12);
    }

}

运行结果如下:

五、总结

优点:

1、降低了请求发送者和接收者之间的耦合关系。sender只需要知道chain,不必知道chain中的具体的handler。

2、增强了系统的可扩展性。可以动态地在链中增加或者删除处理者,来满足不同的处理需求。

3、简化了对象间的连接。sender仅需维持一个指向chain对象的引用,chain对象会自行维护对真正处理者的引用。

4、责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

5、可以理解为财务审批流程,一个请求需要层层审批,可以通过责任链来实现。

缺点:

1、不能保证请求一定被接收。由于一个请求没有明确的接收者,所以不能保证它一定会被处理。

2、请求可能需要遍历整个链才能找到合适的处理者,影响效率。

3、调试不方便。较长的链条可能会使调试变得困难。

4、如果责任链比较长,性能会受到一定影响。

5、处理者必须知道链的结构和组成。

应用场景:

1、多级请求处理

将请求的处理分发给一个处理链,让请求依序经过整个链中的处理器,如购买订单的批准流程。

2、异常处理

将异常处理委托给责任链,按顺序查找能够处理该异常的处理器。

3、Servlet过滤器

在Servlet中,可以使用过滤器链对请求进行过滤和处理。

4、Logging filters

日志框架允许定义日志过滤器链,过滤和处理不同优先级的日志请求。

5、前端拦截器

在Vue、Angular等框架中,使用拦截器链对请求进行拦截处理。

6、Spring AOP

Spring AOP的拦截器链也是一种应用责任链模式的例子。

7、J2EE过滤器

在J2EE的Web应用中,过滤器(Filter)经常以链的形式应用。

符合的设计原则:

1、单一职责原则(Single Responsibility Principle)

责任链上的每个处理器只需要关注自身的逻辑,不需要关心链的其它部分。

2、开闭原则(Open Closed Principle)

可以通过添加新的处理器来扩展责任链,而无需修改现有代码。

3、组合复用原则(Composite Reuse Principle)

链中的处理器可以通过组合的方式产生新的对象,而请求的发送者只与链作为一个整体进行交互。

4、依赖倒置原则(Dependency Inversion Principle)

请求的发送者依赖抽象的链对象,而不是具体的处理器对象。

5. 迪米特法则(Law of Demeter)

每个处理器只与它的后继者交互,而不需要知道链的全貌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/746189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

交易策略对交易者多重要,4点讲明白

初入交易市场的交易者&#xff0c;一定听过交易策略你对交易者的重要性&#xff0c;但是您可能不明白为什么&#xff0c;今天Forexclub通过4点给初入交易市场的交易者&#xff0c;讲解交易策略的重要。希望能帮助到各位刚进入交易市场的初学者。 首先&#xff0c;当交易者确定好…

数字农业农村数字化整体解决方案

导读&#xff1a;原文《数字农业农村解决方案 》共69页ppt&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考 完整版领取方式 完整版领取方式&#xff1a; 如需获取完整的电…

LangChain快速开始

什么是LangChain langchain 是一个框架&#xff0c; 用于连接大语言模型的框架&#xff0c; 它提供了一整套工具、组件和接口&#xff0c;简化上层应用与大语言模型&#xff0c;聊天模型的的过程&#xff0c;可轻松管理与模型的交互&#xff0c;以及跟多组件链接起来。 在 La…

创建空对象{}的数组,空对象地址是否指向同一处

今天&#xff0c;突发奇想&#xff0c;突然想到这个奇葩的问题&#xff0c;实践才是检验真理的唯一标准&#xff0c;下面一一举例验证这个问题的可能性&#x1f601;&#x1f601;&#x1f601;。 首先&#xff0c;创建空对象的数组的方式有多种 &#x1f440;&#x1f440;方…

ChatGPT 最佳实践指南之:将复杂任务拆分为较简单的子任务

Split complex tasks into simpler subtasks 将复杂任务分解为较简单的子任务 Just as it is good practice in software engineering to decompose a complex system into a set of modular components, the same is true of tasks submitted to GPTs. Complex tasks tend to …

Maven学习及分模块创建

一、引言 1.1 项目管理问题 写项目时&#xff0c;我们需要引用各种 jar 包&#xff0c;尤其是比较大的工程&#xff0c;引用的 jar 包往往有几十个乃至上百个&#xff0c; 每用 到一种 jar 包&#xff0c;都需要手动引入工程目录&#xff0c;而且经常遇到各种让人抓狂的 jar 包…

【Hello mysql】 mysql的复合查询 (重点)

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的复合查询 mysql的复合查询 基本查询回顾查询工资高于500或岗位为MANAGER的雇员&#xff0c;同时还要满足他们的姓名首字母为大写的J按照部门号升序而雇员的工资降序排序使用年薪进行降序排序显示工资最高的员工…

kgm --> mp3

kgm转换mp3 kgm应该是kugou那个音乐播放器的音乐文件吧&#xff0c;把mp3转成自己定义的文件 转换工具&#xff0c;免费一天3首 转换完成头部&#xff0c;添加了几秒的广告&#xff01;&#xff01;&#xff01;唉 转换修改mp3头部 作为有开发经验的我&#xff0c;哪里有法子…

音视频编码实战-------pcm+yuv数据转成MP4

文章目录 1.编码流程图2.相关模块及函数2.1 编码器相关API2.2 复用器相关API2.3 重采样相关API注意点 简单的编码流程相关代码 1.编码流程图 2.相关模块及函数 2.1 编码器相关API avcodec_find_encoder: 根据编码器ID查找编码器 avcodec_alloc_context3:创建编码器上下文 avc…

使用wxPtyon和pillow开发拼图小游戏(一)

刚学习python&#xff0c;心血来潮&#xff0c;使用wxPython和pillow开了一个简单的拼图小游戏&#xff0c;大家分享一下 wxPython是Python语言的一套优秀的GUI图形库&#xff0c;在此项目里主要用来开发GUI客户页面&#xff1b;Pillow是一个非常好用的图像处理库&#xff0c;…

Python编译器Pycharm使用技巧

欢迎来到mo的python学习之路 目录 pycharm一些小技巧 1.更换pycharm主题颜色 1.1默认颜色 1.2设置其他颜色 2.汉化 2.1具体操作 3. 创建python包和文件 &#xff0c;运行python文件 3.1创建python包 3.2创建python文件 3.3运行python文件 3.快捷方式 pycharm一些小技巧 …

2023年11月软考高级网络规划设计师报名时间-报名入口-报名流程

软考高级网络规划设计师报名时间&#xff1a; 广东2023下半年软考高级网络规划设计师报名时间&#xff1a;8月16日9:00-8月24日17:00 江西2023下半年软考高级网络规划设计师报名时间&#xff1a;8月15日9点-9月8日17点 安徽2023下半年软考高级网络规划设计师报名时间&#x…

NTIRE 2023 Challenge on Efficient Super-Resolution——RepRFN:当RFDN遇到重参数化

RepRFN&#xff1a;当RFDN遇到重参数化 0. 简介 NTIRE 的全称为New Trends in Image Restoration and Enhancement Challenges&#xff0c;即“图像复原和增强挑战中的新趋势”&#xff0c;是CVPR(IEEE Conference on Computer Vision and Pattern Recognition)举办的极具影响…

终端关于GPU的命令行

1.了解GPU的资源利用情况&#xff1a; nvidia-smi 2.实时刷新&#xff08;1秒&#xff09;&#xff1a; nvidia-smi -l 1 3.配合watch命令可实时显示GPU运行状态&#xff1a; watch -n 1 nvidia-smi 其中 1 为刷新的时间间隔。 4.将监控结果写入文件&#xff0c;并且指定…

又是一条慢 SQL 改写,拿捏!

作者分享了一条慢 SQL 分析和优化的过程&#xff0c;总结出切实有效的优化手段。 作者&#xff1a;马文斌 MySQL 爱好者。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 背景 开发同学丢…

苹果M1/M2 Mac正式支持运行Win11

微软与虚拟化软件 Parallels 达成合作&#xff0c;允许在 Apple M1 和 M2 Mac 上的虚拟环境中运行 Windows 11。“Parallels Desktop 版本 18 是一个授权解决方案&#xff0c;用于在其平台上的 Apple M1 和 M2 计算机上的虚拟环境中运行 Arm 版本的 Windows 11 Pro 和 Windows …

算法学习 day23

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代…

【高级程序设计语言C++】初识模板

1. 函数模板1.1函数模板的实例化1.2显示实例化1.3模板参数的匹配原则 2.类模板2.1类模板的定义格式2.2类模板的实例化 1. 函数模板 概念&#xff1a; 函数模板代表了一个函数家族&#xff0c;该函数模板与类型无关&#xff0c;在使用时被参数化&#xff0c;根据实参类型产生函…

字符串模式匹配算法(暴力破解、KMP、BM、Sunday)

目录 暴力破解 KMP 算法 构造 next 数组 KMP代码 BM 算法 Sunday 算法 参考资料 又通过leetcode复习了之前的知识:找出字符串中第一个匹配项的下标 暴力破解 你的面前有两段序列 S 和 T&#xff0c;你需要判断 T 是否可以匹配成为 S 的子串。 你可能会凭肉眼立即得出结…

11万字智慧环卫管理平台综合解决方案2023

导读&#xff1a;原文《11万字智慧环卫管理平台综合解决方案word2023》word&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 第1章 项目概述 1.1 项目名称 …