23种设计模式之责任链模式

文章目录

    • 23种设计模式之责任链模式
    • 主要角色和结构
    • 工作原理
    • 简单实现 - 学生成绩打印
    • 优点
    • 责任链 - 缺点
    • 责任链 - 应用场景
    • 责任链模式在Spring中的使用

23种设计模式之责任链模式

责任链设计模式是一种行为型设计模式,它允许多个对象依次处理一个请求,直到有一个对象处理这个请求为止。

主要角色和结构

  1. 抽象处理者(Handler)
    • 定义了处理请求的接口,其中包含一个指向下一个处理者的引用。
    • 通常有一个抽象方法来处理请求,子类需要实现这个方法。
  2. 具体处理者(ConcreteHandler)
    • 实现了抽象处理者的接口,具体处理请求。
    • 如果自己无法处理请求,则将请求转发给下一个处理者。

工作原理

当一个请求产生时,它会被传递给责任链中的第一个处理者。这个处理者会尝试处理请求,如果它能够处理,就处理并结束请求的传递;如果不能处理,它会将请求传递给下一个处理者,如此继续,直到请求被处理或者到达责任链的末尾。

简单实现 - 学生成绩打印

学生的成绩打印,成绩大于80分-优秀,成绩60~80分合格,成绩小于60分不合格。

在这里插入图片描述

abstract class ScoreHandler {protected ScoreHandler nextHandler;public void setNextHandler(ScoreHandler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleScore(int score);
}class ExcellentScoreHandler extends ScoreHandler {@Overridepublic void handleScore(int score) {if (score > 80) {System.out.println("成绩优秀");} else if (nextHandler!= null) {nextHandler.handleScore(score);}}
}class PassScoreHandler extends ScoreHandler {@Overridepublic void handleScore(int score) {if (score >= 60 && score <= 80) {System.out.println("成绩及格");} else if (nextHandler!= null) {nextHandler.handleScore(score);}}
}class FailScoreHandler extends ScoreHandler {@Overridepublic void handleScore(int score) {if (score < 60) {System.out.println("成绩不及格,需重修");} else if (nextHandler!= null) {nextHandler.handleScore(score);}}
}

使用:在使用时需要创建责任链。也就是需要设置下一个处理器setNextHandler

public class Main {public static void main(String[] args) {ScoreHandler excellentHandler = new ExcellentScoreHandler();ScoreHandler passHandler = new PassScoreHandler();ScoreHandler failHandler = new FailScoreHandler();excellentHandler.setNextHandler(passHandler);passHandler.setNextHandler(failHandler);excellentHandler.handleScore(75);excellentHandler.handleScore(90);excellentHandler.handleScore(45);}
}

在这个例子中,根据学生的成绩,不同的处理者会打印出相应的成绩状态。如果一个处理者不能处理当前成绩,它会将请求传递给下一个处理者。

执行结果

成绩及格
成绩优秀
成绩不及格,需重修

优点

  1. 降低了对象之间的耦合度:请求的发送者和接收者之间没有直接的耦合关系,发送者只需要将请求发送到责任链上,而不需要知道具体由哪个对象来处理请求。
  2. 增强了系统的灵活性:可以动态地添加或删除处理者,以及改变处理者的顺序,而不影响系统的其他部分。
  3. 提高了代码的可维护性:每个处理者只负责自己的处理逻辑,代码的职责更加清晰,易于维护和扩展。

责任链 - 缺点

  1. 存在请求可能不被处理的风险,因为无法确保责任链中的某个处理者一定会处理该请求。
  2. 当责任链过长时,会带来较大的性能开销,因为请求需要依次经过多个处理者,可能导致处理时间延长。
  3. 调试过程较为复杂,由于请求在多个处理者之间传递,出现问题时难以快速确定具体的问题节点。

责任链 - 应用场景

  1. 异常处理:可通过责任链模式,将不同类型的异常依次交由特定的处理者进行处理,确保异常得到妥善解决。
  2. 中间件:在中间件的实现中,责任链模式能让不同的中间件组件依次对请求进行处理,增强系统的灵活性和可扩展性。
  3. GUI:在图形用户界面系统中,事件可以通过责任链进行传递和处理,不同的组件可根据自身能力处理特定事件。
  4. 工作流:适用于工作流场景,不同的任务节点可以组成责任链,依次处理任务,直至完成整个工作流程。

责任链模式在Spring中的使用

1、DispatcherServlet

DispatcherServlet处理请求的过程中就用到了责任链模式。

在 Spring MVC 中,当一个请求到达DispatcherServlet后,会经过一系列的拦截器(HandlerInterceptor)进行处理。这些拦截器组成了一个责任链,每个拦截器可以在请求处理的不同阶段进行预处理(preHandle)、后处理(postHandle)以及请求完成后的处理(afterCompletion)。如果某个拦截器的preHandle方法返回false,则后续的拦截器和处理器将不会被执行。

这种方式使得请求的处理更加灵活,可以方便地添加、删除或调整拦截器的顺序,而不影响核心的请求处理逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的外卖点餐系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootJSP 工具&#xff1a;IDEA/Eclipse、Navicat、Maven、Tomcat 系统展示 首页 用户管理界…

本地使用Docker部署Nexus Maven私有仓库工具结合内网穿透实现远程管理

文章目录 前言1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus 前言 本文主要介绍在Linux中使用Docker来一键部署Nexus Maven私有仓库工具并结合Cpolar内网穿透实现远程访问Nex…

CosyVoice:开源强大的 AI 语音合成工具

在当今科技飞速发展的时代&#xff0c;AI 语音合成技术正逐渐改变着我们的生活。今天&#xff0c;就为大家介绍一款卓越的语音合成工具——CosyVoice。 一、安装步骤 克隆和安装&#xff1a; 克隆仓库&#xff1a;git clone --recursive https://github.com/FunAudioLLM/Cos…

LabVIEW步进电机控制方式

在LabVIEW中控制步进电机可以通过多种方式实现。每种方法都有其独特的优缺点&#xff0c;适用于不同的应用场合。下面详细介绍几种常见的步进电机控制方式&#xff0c;并进行比较。 1. 开环控制&#xff08;Open-Loop Control&#xff09; 特点 通过定期发出脉冲信号来控制步进…

SpringBoot整合Minio及阿里云OSS(配置文件无缝切换)

SpringBoot整合Minio及阿里云OSS 文章目录 SpringBoot整合Minio及阿里云OSS1.Minio安装测试1.Docker安装启动容器 2.创建bucket3.上传文件修改权限 2.SpringBoot整合Minio及阿里云OSS1.公共部分抽取2.Minio配置整合1.添加pom依赖2.添加配置文件3.操作接口实现 3.阿里云OSS配置整…

家政上门小程序系统设计解析

一、系统概述 上门家政系统是一种基于互联网技术的综合性服务平台&#xff0c;该系统利用大数据分析和人工智能算法&#xff0c;实现家政服务资源的有效整合与优化配置&#xff0c;进而达到用户与家政服务提供者之间的精准匹配。编辑&#xff1a;qawsed2466 二、系统功能模块 …

RabbitMQ简介

RabbitMQ简介 MQ 百度百科-MQ MQ&#xff1a;Message Queue 消息队列 # 何为消息队列&#xff1f; 消息&#xff1a;字符串&#xff0c;数字&#xff0c;对象&#xff0c;文件...... 业务中需要用到的数据都可以称为消息 队列&#xff1a;先进先出的数据结构常用来解耦&…

【Python知识宝库】迭代器与生成器:高效处理大数据集

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 前言一、迭代器&#xff1a;逐个访问数据的艺术1. 迭代器的定义2. 自定义迭代器3. 迭代器的优势 二、生成器&#xff…

分布式风电电池储能系统

风能作为一种清洁的可再生能源,越来越受到世界各国的*视。但风能随机波动的特点,造成风电出力的频繁波动,使电网的调频、调峰压力加大,成为长期困扰风电并网的主要难题。 我国的弃风限电*次出现于2010年,此后弃风从零星现象快速扩散,2012年的情况*为严*,弃风率达17%。之后随着…

VueSax-解决Vue3报错问题,并支持typescript

以下为坑点 根据官方提示&#xff0c;本人在vue3typescript的项目中添加了vuesax的组件依赖 根据正常的导入依赖思路编写代码&#xff0c;发现typescript一直报 查询vuesax的目录文件发现存在ts文件&#xff0c;于是乎觉得是自己的问题&#xff0c;就查阅gpt与网上资料&#x…

【学习笔记】SSL证书安全机制之证书撤销

前言&#xff1a;以往提到过&#xff0c;钓鱼网站会仿冒我们&#xff0c;如果我们的私钥泄露了&#xff0c;如果被不法分子得到了私钥&#xff0c;他们就能假装是我们网站。那现在&#xff0c;我们要做的是生成新私钥并申请新证书。问题来了&#xff0c;旧的证书亦然存在且有效…

sql-labs51-55通关攻略

第51关 一.查询数据库 1and updatexml(1,concat(0x7e,(select database()),0x7e),1)-- 二.查表 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase() ),0x7e),1) -- 三.查列 and updatexml(1,concat…

如何利用mHand Pro动捕数据手套连接虚拟与现实?

数据手套作为虚拟现实中的一种交互动捕设备&#xff0c;能够模拟真人手部的动作和感知反馈&#xff0c;实现人机交互的效果。随着虚拟现实技术的不断发展&#xff0c;数据手套也在不断地改进和升级。 mHand Pro是一款由拥有多年经验的惯性动作捕捉技术团队广州虚拟动力研发的数…

Java并发编程实战 04 | 使用WaitNotify时要注意什么?

在 Java 中&#xff0c;wait()、notify() 和 notifyAll() 方法在多线程编程中主要用于线程间的协作和同步。理解这些方法的使用特点对于编写稳定的多线程程序至关重要。我们将从以下三个问题入手深入探讨它们的使用&#xff1a; 为什么必须在 synchronized 代码块中使用 wait(…

gazebo可能打不开的问题

如果经常遇到gazebo只能断网才能运行的时候&#xff0c;主要就是因为无法联网访问gazebo的在线模型库&#xff0c;此时我们一般无法在联网的情况下打开gazebo。 这个时候就直接将下载好的模型先放到~/.gazebo/models/文件夹下面即可&#xff1a; https://github.com/osrf/gazeb…

大语言模型(LLM)如何更好地继续预训练(Continue PreTraining)

预训练&#xff08;Pretraining&#xff09;是一个非常消耗资源的工作&#xff0c;尤其在 LLM 时代。随着LLama2的开源&#xff0c;越来越多人都开始尝试在这个强大的英文基座模型上进行中文增强。但&#xff0c;我们如何才能保证模型在既学到「中文知识」的情况下&#xff0c;…

简单的EasyCaptcha图片验证码学习

简单的EasyCaptcha图片验证码学习 1. 需求 图片验证码是一种常见的验证形式&#xff0c;它通过生成一串随机数字或符号&#xff0c;并加入一些干扰像素&#xff0c;最终生成用于验证的图片。这种验证码的设计旨在增加破解难度&#xff0c;主要通过加大干扰强度来提高安全性。…

vue3 element-plus form 表单 循环校验

需求&#xff1a; 表单是循环出来的&#xff0c;3个一组&#xff0c;每组对于前端来说是一样的&#xff0c; 需要校验输入框是否必填是否为小数或者整数 效果&#xff1a; 未输入--显示&#xff1a;请输入 输入不是小数或整数--显示&#xff1a;请输入整数或小数 输入正确…

Vue - 关于Router路由跳转时显示的animate.css动画

Vue - 关于Router路由跳转时显示的animate.css动画 在Vue中&#xff0c;操作路由跳转时页面是闪白的&#xff0c;没有动画效果&#xff0c;我们可以通过在router-view中设置transition&#xff0c;并搭配animate丰富的动画效果来美化路由跳转时的显示效果. 1.安装animate np…

Java使用类加载器解决类冲突,多版本jar共存

Java使用类加载器解决类冲突 1、案例说明2、打包新版本POI并将要调用的方法封装2.1、POM文件2.2、封装的方法 3、要使用多个POI版本的项目3.1、打包前面的项目生成一个jar包3.1、POM文件3.2、类加载器代码3.3、Jar加载工具3.4、最终调用 1、案例说明 项目中已经有了一个旧版本…