菜鸟程序员都能看懂的“职责链模式”

java文件/图片的上传与下载 以及MultipartFile 阅读详情

最近河北一直在报道新冠疫情的相关信息,大家一定要注意防护,戴口罩,少聚集,勤洗手。相信河北、相信中国,我们一定会挺过去的。

概述

职责链模式也被称为责任链模式,是行为型设计模式的一种。

职责链模式的核心思想是:将请求的发送者和接收者进行解耦,通过创建一个接收者对象的“链”(就是将多个接收者连接起来)来处理请求。

在职责链模式中通常每个接收者都包含另一个接收者的引用,这样在处理请求时,如果自己无法处理该请求时就会把请求,传递给下一个接收者,依次类推直到最后。

职责链模式UML类图

在这里插入图片描述

类图讲解

Handler:抽象处理者角色;定义了处理请求的相关接口,并聚合了一个Handler对象。
ConcreteHandlerA/B:具体处理者角色;继承了Handler并实现了处理请求的相关接口;主要的作用是处理自己负责的请求,如果请求不属于自己时,负责将请求传递给下一个处理者。
Request:表示请求角色。
Client:客户端测试类。

演示案例

案例:通过职责链模式来实现根据请假天数的不同需要不同领导进行审批的功能。

审核请求 => 对应请求角色

public class VerifyRequest {

  // 请假天数
  private int days;

  // 请求者姓名
  private String requestorName;

  // ...get()和set();
}

抽象处理者

public abstract class Approver {

  // 下一个处理者
  protected Approver approver;

  // 审核(处理请求的方法)
  public abstract void verify(VerifyRequest request);

  public void setApprover(Approver approver) {
    this.approver = approver;
  }
}

具体处理者

// 团队组长
public class GroupLeader extends Approver {

  @Override
  public void verify(VerifyRequest request) {
    if (request.getDays() <= 3) {
      System.out.println("团队组长,同意了" + request.getRequestorName()
          + "的" + request.getDays() + "天请假申请。");
    } else {
      // 不属于当前处理者的处理范围,让下一个处理者处理
      approver.verify(request);
    }
  }
}

// 项目经理
public class ProjectManager extends Approver {

  @Override
  public void verify(VerifyRequest request) {
    if (request.getDays() > 3 && request.getDays() <= 10) {
      System.out.println("项目经理,同意了" + request.getRequestorName()
          + "的" + request.getDays() + "天请假申请。");
    } else {
      // 不属于当前处理者的处理范围,让下一个处理者处理
      approver.verify(request);
    }
  }
}

// 老板
public class Boss extends Approver {

  @Override
  public void verify(VerifyRequest request) {
    if (request.getDays() > 10) {
      System.out.println("老板,同意了" + request.getRequestorName()
          + "的" + request.getDays() + "天请假申请。");
    } else {
      // 不属于当前处理者的处理范围,让下一个处理者处理
      approver.verify(request);
    }
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    // 创建请求
    VerifyRequest request = new VerifyRequest();
    request.setDays(10);
    request.setRequestorName("编程小菜鸟");

    // 创建处理者链
    GroupLeader groupLeader = new GroupLeader();
    ProjectManager projectManager = new ProjectManager();
    Boss boss = new Boss();
    groupLeader.setApprover(projectManager);
    projectManager.setApprover(boss);
    boss.setApprover(groupLeader);

    // 进行审核
    groupLeader.verify(request);
  }
}

测试结果

在这里插入图片描述

总结

1、职责链模式将请求和处理进行拆分,从而实现了解耦,并且提高了系统的灵活性。

2、客户端只需要将请求发送到职责链上即可,无需关心请求的处理细节和跳转过程。

3、使用职责链模式会影响程序的性能,特别是链比较长的时候,因此需要控制其最大节点数。

4、职责链模式采用了类似递归的方式完成请求的处理,这种方式会增加调试的难度。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。

在这里插入图片描述

java远程调用接口、URL的方式 阅读详情

相关推荐

(UE5 5.2)HISM Mobile DrawInstance在渲染层的实现浅分析

在 (UE4 4.27) UHierarchicalInstancedStaticMesh(HISM)原理分析 这篇博客大致介绍HISM组件从游戏线程到渲染线程的重建KD-Tree和剔除并提交DrawCall逻辑,但是没有分析渲染层的大致数据结构和实现. 可以看出FHierarchicalStaticMeshSceneProxy 实际存储Instance数组数据来自于FInstancedStaticMeshSceneProxy FHierarchicalStaticMeshSceneProxy只是以FClu

qq_29523119的博客 2725

Servlet--urlpartten配置,HTTP概述--请求消息--请求行,请求头&请求体

黑马程序员 Servlet–urlpartten配置 HTTP–概述 HTTP–请求消息–请求行 HTTP–请求消息–请求头&请求体

qq_40649503的博客 211

达梦DCA2023年10月培训及考试总结

本次培训共分三天,培训内容不单单是DCA的单机安装、实例创建、库表操作等,培训内容是把关系型数据库的理论及DM8的产品结合起来讲,很实用。具体的考试则是需要个人大量的线下练习,考试总体而言都是培训讲过的内容,只要用心听,好好练习,哪怕是没有计算机基础的童鞋也能考过。提示:以下是本篇文章正文内容,下面案例可供参考总体而言,本次考试不是很难,用心准备,考前认真听讲,考后多次练习,基本都能通过。

qinjuao的博客 2319

远程传输文件--java文件流

花了几天时间,搞了一下远程文件传输的事儿 1.发送文件有两种方式 public String upLoadFilePost(String actionUrl, Map<String, List<File>> files, Map<String, String> textMap) throws IOException { String BOUNDARY = java.util.UUID.randomUUID().toString();

日光倾城 6114

密码学系列3-Elgamal加密及其IND-CPA安全性证明

但这没有任何影响,敌手本身就只能知道公钥,他并没有能力知道挑战者是否知道对应的私钥。所以上述整个游戏就是一个模拟实验,敌手无法区分挑战者运行的是这个模拟实验,还是真正的按照第一节的算法构造的实验(挑战者知道私钥…为什么合起来的时候有1/2:因为T既可能是随机的也可能是g^{ab},这两种情况概率为1/2。能够攻破Elgamal加密方案,那么挑战者利用敌手的能力构建下面游戏,来求解困难性问题DDH。就是挑战者选的随机数,虽然挑战者自己也不知道。),否则挑战者输出0,作为DDH的回答。

qq_41359358的博客 1249

Allegro如何导出和导入器件模型Signal_Model操作指导

在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。如下图,需要把R7002的Signal_Model导入到另外一块没有给R7002加好模型的BRD中。Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中,如何导出和导入器件模型Signal_Model操作指导。

weixin_54787054的博客 1896

java springboot实现上传MultipartFile类型 进行HttpRequest调用传入第三方上传接口

MultipartFile 转换为 File 文件。 java后端调用第三方接口上传

AstarCloud 6324

〖Python网络爬虫实战㊴〗- 极验滑块介绍(一)

我们对这个看到不陌生,现在,大多数平台都是用的是这个平台的验证码,我们今天来学习一下,极验滑块验证码的逆向,其他的都差不多。我们了解到这个平台提供了许多验证的方式。现在大多数还是滑块比较多,滑块验证码是一种常见的验证方式,其主要思路为用户通过拖动滑块来完成验证。具体流程如下:首先,用户需要进行滑块验证码的操作,网站会向用户展示一张图片,图片上通常会有一些随机的文字和背景干扰。用户需要通过鼠标拖动滑块,将其移动到指定位置上,通常是将滑块拖动到图片的相应位置上来完成验证。

爱吃饼干的小白鼠的博客 2878

瑞_23种设计模式_职责链模式

本文章为瑞_系列专栏之《23种设计模式》的职责链模式篇。主要是抽象处理者类 Handler 类中的submit方法,即递归+多态。通常用于实现不同的处理对象来处理一个请求,但具体由哪个对象处理则在运行时动态决定,可以有效避免使用众多的 if 或者 if···else 语句。为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2291

2026年数字IC设计华为笔试带答案解析

这篇文章是一份数字IC设计工程师笔试的试卷结构和部分题目解析。试卷包含单选题31题(每题2分)、多选题10题(每题4分)和简答/编程题4题(每题7分),总分130分,考试时长120分钟。 摘要重点: 试卷涵盖数字IC设计的关键知识点,包括Verilog语法、时序逻辑、状态机设计、跨时钟域处理等; 题目解析详细说明了各选项的正确性,如非阻塞赋值特性(D错误)、功耗影响因素(C与组合逻辑级数弱相关)等; 包含实际工程问题,如DDR4接口电平(SSTL-1.2)、卡诺图变量排序(格雷码)等; 部分题目考察基础概念

Open 368

DCM07-诊断服务EcuReset ($11 )的配置和实现

文章目录1 诊断服务EcuReset ($11 )1.1 概述1.2 诊断模式声明组1.3 代码实现1.4 配置参数 传送门 ==>> AutoSAR实战系列300讲「糖果Autosar」总目录 1 诊断服务EcuReset ($11 ) 1.1 概述 该服务实现了 ECU 内的复位功能,协议的具体理论讲解请参考「FlashBootloader03【电控单元复位服务($11)】」。在接收到UDS 服务 0x11 的请求时,DCM 模块应触发 ModeDeclarationGroupPrototy

2063

【Java设计模式】· 职责链模式(Chain of Responsibility)

职责链模式: 1.觉得学过的东西如果不记下来就太浪费了,还会经常忘掉,于是乎开始写博客。我只是一个菜鸟程序员,但有一颗向往技术大牛的心。 2.职责链模式:当一个问题需要经过“重重考虑”才能给出结果时,这样的“重重考虑”的过程,需要用到职责链模式。职责链模式中,有多个负责不同职责的handler,当handlerA解决不了问题时,会交给handlerB,而如果handlerB也不能解决时,就会交给handlerC····以此类推,直到最后一个handler。

早起早睡的少年郎 611

基于工作流的低代码AI应用开发:Flock平台核心架构与实战指南

在AI应用开发领域,工作流编排正成为连接大语言模型(LLM)能力与复杂业务逻辑的关键技术。其核心原理是将任务分解为模块化节点,通过可视化方式定义执行顺序与数据流向,从而实现灵活可控的自动化流程。这种范式极大地提升了开发效率,降低了技术门槛,使得开发者能够聚焦于业务设计而非底层代码。在技术价值层面,工作流编排支持检索增强生成(RAG)、多智能体协作等高级模式,并能通过人工干预节点确保关键流程的可靠性与合规性。其典型应用场景包括智能客服、自动化办公、数据分析助手等。本文以Flock平台为例,深入解析了如何利用其

weixin_26848497的博客 381

深入浅出设计模式之责任链模式

责任链模式 文章目录责任链模式一、定义二、使用场景1、解决Bug程序 1.02、解决Bug程序 2.03、解决Bug程序 3.04、解决Bug程序 4.0三、总结 一、定义 责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,知道有一个对象处理完它为之。 二、使用场景 我们每个人在工作中都承担着一定的责任,比如程序员承担着开发新功能、修改 bug 的责任,运营人员承担着宣传的责任、HR 承担着招聘新人的责任。我们每个人的

weixin_45278293的博客 513

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java实现二十三种设计模式(四)—— 十一种行为型模式 (上)——责任链模式、命令模式

Java实现二十三种设计模式(四)—— 十一种行为型模式 (上)——责任链模式、命令模式

qq_41824825的博客 565

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JS设计模式——责任链模式

JavaScript设计模式

MyBlog 1677

Unity责任链模式实战:游戏事件处理与代码解耦

在软件架构中,设计模式是解决常见问题的可复用方案,其中责任链模式通过将请求的发送者与接收者解耦,允许多个对象按顺序处理同一请求,显著提升了代码的模块化和可维护性。其核心原理是构建一条处理器链条,每个节点独立判断并处理请求,无法处理则向后传递,这种机制特别适用于需要多步骤校验或广播式响应的场景。在游戏开发领域,该模式的技术价值尤为突出,能够优雅管理如输入事件、伤害计算、状态切换等复杂流程,避免代码臃肿。Unity引擎的组件化架构为责任链提供了天然土壤,开发者可将每个处理器实现为MonoBehaviour组件,

weixin_33694620的博客 529

菜鸟学习设计模式的心得

【真的有那么难吗】 菜鸟学习设计模式真的很难吗,其实很难,我发现我这个项目已经开了两个月了,好艰难,原先只是在看,并没有过脑子,现在突然间发现这些是可以串起来的,原来还是如此的简单,每一个例子的故事也没有这么难记,这里也感谢一下勇杰,我验项目之前帮助我突破了几个设计模式,还要感谢我的师傅们,在验收项目时,给我拓展了一些知识,慢慢的学吧,怎么以后重构还会用到这些...

张伟光 1301

设计模式全详解——11种行为型模式(下)

设计模式是程序员必修课之一,本文对行为型设计模式中的五种进行了大白话的解析,学习设计模式必读!

Nimrod__的博客 538

Java程序员从笨鸟到菜鸟之(三十二)大话设计模式(二)设计模式分类和三种工厂模式

Java程序员从笨鸟到菜鸟之(三十二)大话设计模式(二)设计模式分类和三种工厂模式

uffvhj的博客 153

Leetcode-设计模式-行为型模式

行为型模式 一、责任链模式(责任链主要用于处理 职责相同,程度不同的类) 责任链模式的优点: 降低对象之间的耦合 扩展性强,符合开闭原则 灵活性强 简化对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用 缺点: 如果责任链过长,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。 不能保证每个请求一定被处理,该请求可能一直传到链的末端都得不到处理。 例子 新建一个程序员抽象类: public abstract class Programmer { pro

weixin_38367817的博客 1540

设计模式菜鸟笔记

设计模式:就是开发中常见问题的解决思路。是程序员在项目遇到问题后对解决方法的总结。 设计模式的分类:分布式编程模式,用户界面模式,数据模型模式三大类。 GoF设计模式的分类: 根据目的准则分类: 1. 创建型:creational 与对象的创建有关。 2. 结构型:Structural 处理类或对象之间的组合。 3. 行为型:behavioral 描述类或对象如...

xsxjb的专栏 206

23种设计模式-简介

在学习JAVA这条路上,不论是作为JAVA菜鸟还是JAVA老鸟,设计模式都是一门必须熟练掌握的知识。作为菜鸟,应用设计模式的知识可以使你在学习源代码的时候能够看得懂。作为老鸟,在合适的场景下使用设计模式让你的代码达到高内聚、低耦合、精炼代码,提升工作效率。 在这里,我要给大家简单介绍一下这23种设计模式。一、设计模式的分类 设计模式分为三大类: 创...

weixin_34217773的博客 86

经历才能让人成长写一篇有深度的文章 从一个java开发工程师面试问面向对象的理解的经历来解释 那个曾经将DAO层直接暴露给Controller的菜鸟程序员,现在会在领域服务外构筑防腐层 这句话啥意

那个在面试中引以为傲的类图,此刻暴露出致命的脆弱性——子类对父类的过度依赖,就像用钢筋混凝土浇筑的树苗,永远无法长成真正的参天大树。例如,防腐层通常用于与外部系统或不同限界上下文的交互,而在这个例子中,可能更倾向于服务层的使用,但可以调整例子,比如当需要与外部API交互时,使用防腐层来隔离外部模型和内部领域模型的变化。所以,这句话的意思是说,以前新手程序员可能直接将数据访问层暴露给控制器,导致业务逻辑和数据访问耦合紧密,而现在他们学会了在领域服务外构建防腐层,以隔离不同层次,保持系统的松耦合和可维护性。

m0_50272029的博客 688

Java程序员从笨鸟到菜鸟之(三十二)大话设计模式之设计模式分类和三种工厂模式

设计模式分类 首先先简单说一下设计模式的分类设计模式可以分为三大类,分别是创建型设计模式、行为型设计模式以及结构型设计模式。 创建型的设计模式:单例模式(Singleton)、构建模式(Builder)、原型模式(Prototype)、抽象工厂模式(Abstract Factory)、工厂方法模式(Factory Method) 行为设计模式:策略模式(Strategy)、状态模

899
上一篇: 作为优秀的程序员你确定不了解一下“策略模式”
下一篇: 重学Spring框架系列之——什么是Spring框架
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值