【面试题】设计模式-责任链模式

news2024/9/22 9:39:25

设计模式-责任链模式

    • 前言
    • 责任链简历
    • 案例代码
    • 小结

前言

我们知道,设计模式是面试时经常被问到的问题之一,这是因为设计模式能够体现出代码设计的美感,且在很多框架的底层也都会使用到各种设计模式,所以对设计模式的考察,就成了面试时的一个重点。

目前比较流行的有23种设计模式,但如果我们想全都记住,难度确实比较大,不过我们可以通过学习框架中常用的设计模式,来提升自己的代码设计能力和面试水平,比如常见的单例模式、工厂模式、代理模式、适配器模式、观察者模式和责任链模式等。今天这篇文章,老朱就来给大家讲讲责任链设计模式,希望本文可以让大家掌握一种常用的设计模式。


责任链简历

在软件开发中,责任链模式常用于将复杂的业务逻辑拆分为多个小模块,每个模块负责处理其中一部分逻辑,并将剩余的请求传递给下一个模块。这种设计方式可以提高代码的可维护性和可扩展性,也可以更好地解耦各个模块之间的依赖。这么说估计大家会觉得很空洞,没有落地感,老朱先来给大家举两个案例。

比如我们很熟悉的电商网站,假如有一个订单处理流程,一个订单可能需要经过多个处理器来进行处理,包括库存检查、价格计算、优惠券使用等等。如果其中一个处理器无法处理该订单,则将请求传递给下一个处理器,直到所有处理器都处理完成或有一个处理器能够处理该订单为止。


再比如线申请贷款的系统,系统需要根据用户的个人信息来决定是否批准贷款。我们可以将这个业务逻辑拆分为多个小模块,例如根据用户的信用评级、收入、负债等信息来做出判断。这些模块可以构成一个责任链,每个模块都有机会来处理请求,如果一个模块无法处理请求,它就会将请求传递给下一个模块。

另外我们Web中的Filter以及SpringMVC的Interceptor也都采用了责任链设计模式,其实只要你用心琢磨,就会发现很多业务场景中都可以使用该模式,接下来老朱就以申请放贷这个案例来给大家讲讲责任链模式的使用。

案例代码

首先我们来定义一个抽象的接口,代码如下:

public interface LoanHandler {
    //处理器核心处理业务
    boolean approveLoan(LoanApplication application);
    //指定下一个处理器
    void setNextHandler(LoanHandler nextHandler);
}

接下来我们分别定义信用评级处理器、收入评估处理器,代码分别如下:

public class CreditRatingHandler implements LoanHandler {
    private LoanHandler nextHandler;

    public boolean approveLoan(LoanApplication application) {
        if (application.getCreditRating() > 750) {
            return true;
        } else {
            return nextHandler.approveLoan(application);
        }
    }

    public void setNextHandler(LoanHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
}
public class IncomeHandler implements LoanHandler {
    private LoanHandler nextHandler;

    public boolean approveLoan(LoanApplication application) {
        if (application.getIncome() > 50000) {
            return true;
        } else {
            return nextHandler.approveLoan(application);
        }
    }

    public void setNextHandler(LoanHandler nextHandler) {
        this.nextHandler = nextHandler;
    }
}

在这个例子中,CreditRatingHandler会根据用户的信用评级来判断是否批准贷款,如果信用评级大于750,则批准贷款,否则将请求传递给下一个模块。

而IncomeHandler会根据用户的收入来判断是否批准贷款,如果收入大于50000,则批准贷款,否则将请求传递给下一个模块。每个模块都有一个可选的nextHandler参数,表示链上的下一个模块。

最后我们通过使用下面的代码来测试这个责任链:

public static void main(String[] args) {
    LoanApplication application = new LoanApplication("John Doe", 700, 40000, 10000);
    LoanHandler handler1 = new CreditRatingHandler();
    LoanHandler handler2 = new IncomeHandler();

    handler1.setNextHandler(handler2);

    if (handler1.approveLoan(application)) {
        System.out.println("Loan approved.");
    } else {
        System.out.println("Loan denied.");
    }
}

在这个例子中,我们只是使用了简单的输出语句来模拟处理器的批准或拒绝操作。而在实际应用中,我们可能需要与外部系统进行交互,或者根据更复杂的业务逻辑进行判断。

小结

总之,责任链模式是一种非常灵活和可扩展的设计模式,在许多实际应用中都有广泛的应用价值。通过将多个处理器链接在一起,并按照特定的顺序进行处理,责任链模式可以帮助我们实现复杂的业务逻辑,提高系统的可维护性和可扩展性。


在这里插入图片描述
             Periodic Comet Swift-Tuttle
             Image Credit & Copyright: Gerald Rhemann

Aug. 8, 2024

Explanation: A Halley-type comet with an orbital period of about 133 years, Comet 109P/Swift-Tuttle is recognized as the parent of the annual Perseid Meteor Shower. The comet’s last visit to the inner Solar System was in 1992. Then, it did not become easily visible to the naked eye, but it did become bright enough to see from most locations with binoculars and small telescopes. This stunning color image of Swift-Tuttle’s greenish coma, long ion tail and dust tail was recorded using film on November 24, 1992. That was about 16 days after the large periodic comet’s closest approach to Earth. Comet Swift-Tuttle is expected to next make an impressive appearance in night skies in 2126. Meanwhile, dusty cometary debris left along the orbit of Swift-Tuttle will continue to be swept up creating planet Earth’s best-known July and August meteor shower.


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

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

相关文章

GNSS天线误差改正

根据原理解析了PPPH中关于天线误差改正部分的源代码,处理了卫星、接收机天线相位中心偏差、接收机天线高误差、天线相位缠绕误差,但是对于天线相位中心变化PCV误差并没有处理,该误差与卫星高度角方位角有关,在读取天线文件数据后需…

PDF转Markdown的利器(MinerU版)

嘿,技术爱好者们!今天,我要向你们介绍一个令人兴奋的开源项目——MinerU,这是一个一站式的高质量数据提取工具,它支持从PDF、网页和多格式电子书中提取数据。 MinerU:一站式开源数据提取工具 自制ModelSco…

09 DMA配合ADC多通道

[TOG] 前言 前面介绍了ADC数模转换,得到了内部的温度值和外部电压值,我感觉这样太消耗CPU的资源了,所以我准备用DMA来帮我从AD的数据寄存器中拿出数据出来,就不用再去读取AD的数据寄存器了。 一、什么是DMA DMA叫做直接存储器…

从分散到集中:TSINGSEE青犀EasyCVR视频汇聚网关在视频整体监控解决方案中的整合作用

边缘计算视频汇聚网关是基于开放式、大融合、全兼容、标准化的设计架构理念,依据《安全防范视频监控联网系统信息传输、交换、控制技术要求》(GB/T28181-2011)标准开发,集流媒体转发、视频编码、视频管理、标准通信协议、网络穿透…

【MAUI】系统主题方案

文章目录 概述具体AppThemeBindingResourceDictionaryApplication.Current.Resources.MergedDictionariesDynamicResource 来源 概述 主要有两种:AppThemeBinding 和ResourceDictionaryApplication.Current.Resources.MergedDictionariesDynamicResource 具体 Ap…

视频美颜SDK的核心技术与直播美颜插件的开发详解

本篇文章,小编将深入探讨视频美颜SDK的核心技术以及如何开发高效的直播美颜插件。 一、视频美颜SDK的核心技术 视频美颜SDK的核心在于其实时图像处理能力,它通过一系列复杂的算法,实现对视频图像的增强和优化。以下是几项关键技术&#xff…

【产品推荐】高性能隔离接口芯片——CMT83085

产品概述 CMT83085是华普微精心打造的一款高可靠性隔离接口芯片,它集成了先进的数字隔离技术和RS-485通信接口,即基于数字隔离技术的高可靠性半双工 RS-485 收发器,专为需要高安全性和长距离数据传输的应用场景设计。 该芯片不仅具备出色的…

鸿蒙开发5.0【应用异常处理】运维

应用异常处理 介绍 本示例介绍了通过应用事件打点hiAppEvent获取上一次应用异常信息的方法,主要分为应用崩溃、应用卡死两种。 效果图预览 使用说明 点击构建应用崩溃事件,3s之后应用退出,然后打开应用进入应用异常页面,隔1mi…

Java学习笔记(二十):反射、动态代理、日志、类加载器、xml、单元测试Junit、注解

目录 一、反射 1.1 反射的概述: 1.2 学习反射到底学什么? 1.3 获取字节码文件对象的三种方式 1.4 字节码文件和字节码文件对象 1.5 获取构造方法 1.6 获取构造方法并创建对象 1.7 获取成员变量 1.8 获取成员变量并获取值和修改值 1.9 获取成员…

002集——C#基本语法——C#学习笔记

C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。 例如,以 Rectangle(矩形)对象为例。它具有 le…

一文读懂如何选择视频孪生三维建模方式及建模精度等级

导言/INTRODUCTION 三维模型是视频孪生应用的基础,建模方式与模型精度将直接影响到最终孪生场景的呈现和应用效果。各种建模方式和模型精度在成本、场景还原真实度、实施周期方面都有自己的特点,因而有着各自的优劣势和适用场景,同一场景可能…

基于Hadoop的国内手机销售大数据分析与可视化研究【百万数据集】

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主项目介绍 绪论研究背景研究目的研究意义 相关技术理论介绍Hadoop相关理论HIve数据仓库flume组件介绍sqoop组件介绍Pyecharts介绍 数据来源及处理数据介绍数据预处理 Hadoop集群搭建Hadoop全…

安装python+python的基础语法

安装python python2为内置,安装python3----3.6.8 最新安装3.12使用源码安装 1.查看yum源,epel [rootpython01 ~]# yum list installed |grep epel 2.安装python3 [rootpython01 ~]# yum -y install python3 3.查看版本 [rootpython01 ~]# python…

计算机硬件 课程导读

目录 一、老师介绍 二、课程目标 三、课程大纲 一、老师介绍 学问小小谢 我是一个热爱分享知识的人,我深信知识的力量能够启迪思考,丰富生活。 欢迎每一位对知识有渴望的朋友,如果你对我的创作感兴趣,或者我们有着共同的兴趣点&…

vue3组件之间通讯

1. props,实现父组件向子组件通讯。 父组件 :对子组件属性绑定要通讯的数据。 子组件:通过defineProps来进行数据接收。 2. emit,实现子组件向父组件通讯。 子组件:通过emit创建向父组件传递数据事件 父组件&#…

Chromium编译指南2024 - Android篇:环境准备(二)

1.引言 在前面的章节中,我们详细介绍了编译 Chromium for Android 所需的系统和硬件要求。在确保您的开发环境符合这些基本要求后,接下来我们将重点讲解如何具体配置您的开发环境,以便顺利编译 Chromium。本篇文章将涵盖从更改软件源到安装基…

[matlab] 鲸鱼优化算法优化KNN分类器的特征选择

目录 引言 智能优化算法概述 智能优化算法在KNN特征选择中的应用 应用步骤 UCI数据集 鲸鱼优化算法 一、算法背景与原理 二、算法组成与步骤 三、算法特点与优势 四、应用与挑战 代码实现 鲸鱼优化算法 主程序 打印结果 引言 智能优化算法在优化KNN(…

5、关于kali搭建vulhub

Vulhub是一个基于Docker和Docker-compose的漏洞靶场环境,所以搭建vulhub分三步: 1、安装docker 2、安装docker-compose 3、安装vulhub 一、安装步骤 1、安装docker 因为kali太久没用,所以需要先更新软件列表最新源 apt-get update 安装do…

C++ vector的基本使用

目录 1. vector的定义 2. 迭代器iterator的使用 3. vector空间增长问题 (1). size与capacity (2). empty与resize与reserve 4. vector的增删查改 (1) . push_back和pop_back (2). find与insert与erase (3). swap与operator[] 5. vector迭代器失效问题 (1). 改变空间 (…

爱玛电动车今年多次抽查不合格:营收增速放缓承压,拟50亿扩产能

《港湾商业观察》廖紫雯 7月26日,市场监管总局发布《2024年上半年电动自行车产品质量国家监督专项抽查结果情况通报》,爱玛电动车五次上榜。 除却一直以来被多次诟病的电动车产品质量问题外,业绩层面上,近两年数据来看&#xff…