设计模式学习之——责任链模式

news/2024/11/27 5:37:51/

责任链模式的基本概念

定义责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照一定顺序处理请求,并且每个对象可以选择自己是否处理该请求或者将其传递给下一个对象处理。

核心思想:将多个处理请求的对象组成一条链,请求在这条链上传递,直到有一个对象处理它。

主要角色

  • 抽象处理者(Handler):定义一个处理请求的接口,并持有对下一个处理者的引用;
  • 具体处理者(ConcreteHandler):实现抽象处理者的接口,处理请求或将请求传给下一个处理者;
  • 客户端(Client):发起请求的对象,不需要知道谁处理了请求,也不需要知道具体的处理者。

责任链模式的使用场景

责任链模式适用场景:

1、当有多个对象可以处理同一个请求时;

2、当处理者之间的顺序不确定时,可以动态组织处理者之前顺序;

3、当请求的处理流程需要灵活配置时;

责任链模式的优缺点

优点

1、降低了请求的发送者和接收者之前的耦合度;

2、提高了系统的灵活性和可扩展性,可以动态地增加或删除处理者;

3、使得请求的处理流程更加清晰和易于维护

缺点

1、可能会导致性能问题,特别是当责任链过长或请求在链中被频繁传递时;

2、如果责任链配置不当,可能会导致请求无法被正确处理;

3、调试时可能会比较复杂,因为请求在链中的传递过程可能涉及多个处理者;

代码示例

以下是一个使用Java语言实现责任链模式的示例,演示了如何处理不同类型的请求

// 抽象处理者接口
abstract class Handler {protected Handler nextHandler;public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public abstract void handleRequest(String request);
}// 具体处理者A
class ConcreteHandlerA extends Handler {@Overridepublic void handleRequest(String request) {if ("A".equals(request)) {System.out.println("ConcreteHandlerA 处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 具体处理者B
class ConcreteHandlerB extends Handler {@Overridepublic void handleRequest(String request) {if ("B".equals(request)) {System.out.println("ConcreteHandlerB 处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 具体处理者C
class ConcreteHandlerC extends Handler {@Overridepublic void handleRequest(String request) {if ("C".equals(request)) {System.out.println("ConcreteHandlerC 处理请求: " + request);} else if (nextHandler != null) {nextHandler.handleRequest(request);}}
}// 客户端代码
public class Main {public static void main(String[] args) {// 创建处理器链Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();Handler handlerC = new ConcreteHandlerC();// 将处理器连接在一起handlerA.setNextHandler(handlerB);handlerB.setNextHandler(handlerC);// 发送请求handlerA.handleRequest("A"); // ConcreteHandlerA 处理请求: AhandlerA.handleRequest("B"); // ConcreteHandlerB 处理请求: BhandlerA.handleRequest("C"); // ConcreteHandlerC 处理请求: ChandlerA.handleRequest("D"); // 无处理者处理请求: D(请求被忽略)}
}

在上面的示例中,我们定义了三个具体处理者(ConcreteHandlerAConcreteHandlerB 和 ConcreteHandlerC),它们分别处理不同类型的请求("A"、"B" 和 "C")。客户端代码创建了一个处理器链,并将请求发送到链上的第一个处理者(handlerA)。根据请求的类型,相应的处理者会处理请求,或者将请求传递给下一个处理者。如果请求的类型不匹配任何处理者,则请求会被忽略。

其他:

责任链模式常见的一些实际应用场景:

  • 用户登录验证
    • 在这种场景下,不同的验证步骤可以看作责任链中的不同节点,依次进行验证,直到所有验证都通过或某个验证失败为止。
    • 手机验证码登录:需要进行用户是否存在、验证码是否为空、验证码是否正确、用户是否锁定、用户是否被禁用等校验。
    • 用户名密码登录:需要进行用户是否存在、用户是否被锁定、密码校验等校验。
  • 请求处理系统

    • 如Web应用中的过滤器链,每个过滤器负责处理不同类型的请求或执行不同的任务,如身份验证、日志记录、请求参数修改等。
    • 请求依次经过责任链中的各个处理器,直到被某个处理器处理或所有处理器都遍历完。
  • 日志系统

    • 不同的日志级别(如INFO、DEBUG、ERROR)会对应不同的处理器。
    • 每个处理器负责处理对应级别的日志消息,并将其记录到相应的日志文件中或发送到日志服务器。
  • 事件处理系统

    • 在图形用户界面(GUI)应用中,事件(如鼠标点击、键盘输入)会触发一系列的处理动作。
    • 这些处理动作可以看作责任链中的不同节点,依次进行处理,直到事件被完全处理或某个节点决定不再继续处理。
  • 数据校验和转换

    • 在数据接收或发送过程中,可能需要对数据进行一系列的校验和转换操作。
    • 这些操作可以看作责任链中的不同节点,依次对数据进行处理,直到数据满足要求或处理完成。
  • 金融业务审批流程

    • 如贷款审批、订单审批等,通常需要经过多个审批环节,每个环节都有相应的审批条件和审批人员。
    • 这些审批环节可以看作责任链中的不同节点,依次进行审批,直到审批通过或拒绝。
  • 消息过滤系统

    • 在消息传递系统中,可能需要对消息进行一系列的过滤操作,如过滤垃圾邮件、过滤敏感词汇等。
    • 这些过滤操作可以看作责任链中的不同节点,依次对消息进行过滤,直到消息满足要求或所有过滤器都遍历完。

责任链模式在这些场景中的应用,使得系统的处理流程更加灵活和可扩展。通过动态地添加或删除处理节点,可以轻松地调整系统的处理逻辑,而无需修改现有的代码结构。同时,责任链模式也使得请求的处理过程更加清晰和易于维护。

责任链模式或者设计模式使用的场景有很多,但是,是否适合使用也很关键,不要为了使用而使用,否则也可能会带来更多的bug~~~


http://www.ppmy.cn/news/1550258.html

相关文章

Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)

目录 1、漏洞描述 2、EXP下载地址 3、EXP利用 1、漏洞描述 Apache OFBiz是一套企业资源计划(ERP)系统。它提供了广泛的功能,包括销售、采购、库存、财务、CRM等。 Apache OFBiz还具有灵活的架构和可扩展性,允许用户根据业务需求…

Postman设置接口关联,实现参数化

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 postman设置接口关联 在实际的接口测试中,后一个接口经常需要用到前一个接口返回的结果, 从而让后一个接口能正常执行,这…

ubity3D基础

Unity是一个流行的游戏开发引擎,它使用C#作为其主要的编程语言。以下是一些Unity中C#编程的基础概念: • Unity编辑器: • Unity编辑器是Unity游戏引擎的核心,提供了一个可视化界面,用于创建和管理游戏项目。 • C#脚本…

【算法】连通块问题(C/C++)

目录 连通块问题 解决思路 步骤: 初始化: DFS函数: 复杂度分析 代码实现(C) 题目链接:2060. 奶牛选美 - AcWing题库 解题思路: AC代码: 题目链接:687. 扫雷 -…

猫用空气净化器哪款牌子除毛好?除毛好用宠物空气净化器牌子推荐

我养了这么多年的猫狗,漫天横飞的猫狗毛和家里的味道,很多年前是无法和解的!就是沙发上、床上、被子上、枕头上、衣服上、一切一切地方的猫毛,你可以在家里任何一个角落都可以见到猫毛。更不用说家里猫咪不过自从有了宠物空气净化…

python学习笔记(12)算法(5)迭代与递归

一、迭代 迭代(iteration)是一种重复执行某个任务的控制结构。在迭代中,程序会在满足一定的条件下重复执行某段代码,直到这个条件不再满足。 迭代通常用于解决需要逐步推进的计算问题,例如遍历数组、计算阶乘等。迭代…

相亲交友小程序项目介绍

一、项目背景 在当今快节奏的社会生活中,人们忙于工作和事业,社交圈子相对狭窄,寻找合适的恋爱对象变得愈发困难。相亲交友作为一种传统而有效的社交方式,在现代社会依然有着巨大的需求。我们的相亲交友项目旨在为广大单身人士提…

【Redis篇】String类型命令详讲以及它的使用场景

目录 前言: 基本命令: setnx/setxx FLUSHALL mest mget 计数命令 INCR / INCRBY DECR/DECYBY INCRBYFLOAT 其他命令 APPEND GETRANGE SETRANGE STRLEN String的典型使用场景 缓存(Cache)功能 计数(…