设计模式:责任链模式

2023-09-17 16:20:25

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象按照顺序处理请求,直到其中一个对象能够处理该请求为止。责任链模式将请求发送者和接收者解耦,使得多个对象都有机会处理请求,同时避免了请求发送者与接收者之间的直接耦合关系。

在责任链模式中,请求被沿着一个链传递,每个对象都有机会处理请求或将其传递给链中的下一个对象。每个对象在收到请求后,可以选择处理请求或将其传递给下一个对象。这样,请求会依次经过链中的对象,直到有一个对象能够处理它为止。

组件

责任链模式通常包含以下角色:

  1. 抽象处理者(Handler):定义了处理请求的接口,通常包含一个指向下一个处理者的引用。
  2. 具体处理者(Concrete Handler):实现了处理请求的方法,如果自己无法处理请求,则将其传递给下一个处理者。

代码示例

abstract class Handler {
    private Handler nextHandler;
     public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
     public void handleRequest(int request) {
        if (canHandle(request)) {
            processRequest(request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
     protected abstract boolean canHandle(int request);
     protected abstract void processRequest(int request);
}
// 具体处理者A
class ConcreteHandlerA extends Handler {
    protected boolean canHandle(int request) {
        return request >= 0 && request < 10;
    }
     protected void processRequest(int request) {
        System.out.println("ConcreteHandlerA 处理请求:" + request);
    }
}
// 具体处理者B
class ConcreteHandlerB extends Handler {
    protected boolean canHandle(int request) {
        return request >= 10 && request < 20;
    }
     protected void processRequest(int request) {
        System.out.println("ConcreteHandlerB 处理请求:" + request);
    }
}
// 具体处理者C
class ConcreteHandlerC extends Handler {
    protected boolean canHandle(int request) {
        return request >= 20 && request < 30;
    }
     protected void processRequest(int request) {
        System.out.println("ConcreteHandlerC 处理请求:" + 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(5);
        handlerA.handleRequest(15);
        handlerA.handleRequest(25);
    }
}

在上述示例中,我们定义了抽象处理者(Handler)和具体处理者(ConcreteHandlerA、ConcreteHandlerB、ConcreteHandlerC)。每个处理者都有一个指向下一个处理者的引用,通过 setNextHandler() 方法进行设置。

在客户端代码中,我们创建了一个责任链,并将请求发送给第一个处理者(handlerA)。每个处理者根据自己的条件判断是否能处理请求,如果可以处理,则进行处理;否则将请求传递给下一个处理者。

这个示例展示了如何使用Java实现责任链模式,通过责任链的方式依次处理请求,直到找到能够处理请求的处理者为止。

源码中使用

责任链模式在源码中有很多应用。以下是一些常见的源码中使用责任链模式的情况:

  1. Java中的异常处理机制:Java中的异常处理机制就是一种责任链模式的应用。当一个异常被抛出时,会从当前方法开始向上查找匹配的异常处理器,直到找到能够处理该异常的处理器为止。
  2. Servlet中的过滤器(Filter):Servlet中的过滤器也使用了责任链模式。多个过滤器按照一定的顺序形成一个责任链,每个过滤器可以对请求进行处理或者传递给下一个过滤器进行处理。
  3. Spring框架中的拦截器(Interceptor):Spring框架的拦截器也是一种责任链模式的应用。拦截器可以在请求处理前后进行一些额外的操作,如权限验证、日志记录等。
  4. Android中的事件分发机制:Android中的事件分发机制也使用了责任链模式。事件从顶层View开始向下传递,每个View可以对事件进行处理或者传递给下一个View进行处理。
    这些是责任链模式在源码中的一些常见应用。责任链模式通过形成一个责任链,将请求的处理逻辑拆分成多个处理者,每个处理者负责处理或传递请求。这样可以实现解耦和灵活的处理逻辑。

优缺点

优点:

  1. 解耦请求发送者和接收者:责任链模式将请求的发送者和接收者解耦,发送者无需知道具体的接收者,只需要将请求发送给责任链的第一个处理者即可。
  2. 可扩展性和灵活性:责任链模式可以动态地添加、修改或删除处理者,灵活地调整责任链的结构和顺序,以满足不同的需求。
  3. 可以对请求进行过滤和处理:责任链模式允许每个处理者对请求进行过滤和处理,可以根据不同的条件选择是否处理请求,以及如何处理请求。
  4. 可以降低耦合度:责任链模式将请求的发送者和接收者解耦,减少了它们之间的直接依赖关系,从而降低了耦合度。
    缺点:
  5. 请求可能未被处理:责任链模式没有保证请求一定会被处理,如果责任链没有正确配置或者没有处理者能够处理该请求,请求可能会被忽略。
  6. 可能存在性能问题:当责任链较长时,请求需要依次经过每个处理者,可能会导致性能下降。同时,过多的处理者也会增加系统的复杂性。
  7. 可能导致调试困难:由于请求的处理者是动态变化的,当出现问题时,可能需要跟踪整个责任链来定位问题,增加了调试的难度。

总结

责任链模式通过将请求的发送者和接收者解耦,提供了一种灵活和可扩展的处理机制。它可以对请求进行过滤和处理,降低耦合度。然而,责任链模式也可能导致请求未被处理、性能问题以及调试困难。在使用责任链模式时,需要根据具体情况权衡其优缺点,确保合理使用。

更多推荐

安防监控视频系统EasyCVR+AI算法智能分析网关助力智慧校园建设

学生是祖国的未来,学校就是培育学生的地方。随着校园信息化建设的不断发展,信息服务在校园管理中的作用也越来越强。在保障学生安全与校园高效管理上,人工智能做出了极大贡献,旭帆科技安防监控系统/视频汇聚/云存储/AI智能视频分析平台EasyCVR基于互联网、大数据、云计算的智慧管理,为提高校园监管标准,推进学校信息化建设,打

redis桌面连接工具Another Redis Desktop Manager使用介绍

AnotherRedisDesktopManager是一种类似于navicat的数据库连接工具,专门用来连接redis,使用起来非常简单方便,在这里推荐给大家。没有用过这个软件的,首先通过下面的网盘链接下载AnotherRedisDesktopManager百度网盘redis下载地址https://pan.baidu.

基于图的基础推荐方式

文章目录1.基于图的基础推荐方式1.1链路预测(LinkPrediction)1.2什么是路径1.3基于路径的基础链路预测1.4图游走算法DeepWalk1.4.1Word2Vec1.4.2DeepWalk原理1.4.3DeepWalk代码示例1.5图游走算法Node2Vec1.5.1Node2Vec原理1.5.2No

视频编辑SDK:轻松打造专业级视频处理能力

视频编辑SDK是一款强大的技术工具,可以帮助开发者轻松实现视频剪辑、特效处理等功能。美摄科技作为业内知名的视频技术公司,其视频编辑SDK凭借独特的功能和易用性,受到了广大开发者的欢迎。美摄科技的视频编辑SDK支持多种视频格式导入,可实现视频剪辑、拼接、变速、调色等基本功能。同时,它还提供了丰富的特效插件,如文字、滤镜、

python基础

一,什么是pythonPython是一种高级、通用且解释型的编程语言,由GuidovanRossum于1991年首次发布。它具有简洁的语法、清晰的代码结构和强大的功能,被广泛应用于各种领域,包括软件开发、数据分析、人工智能、网络编程等。以下是Python的一些特点和优势:简单易学:Python具有直观、简洁的语法,易于

GDPU 数据结构 天码行空2

实验内容用顺序表实现病历信息的管理与查询功能。具体要求如下:利用教材中定义顺序表类型存储病人病历信息(病历号,姓名,症状);要求使用头文件。设计顺序表定位查找算法,写成一个函数,完成的功能为:在线性表L中查找数据元素x,如果存在则返回线性表中和x值相等的第1个数据元素的序号;如果不存在,则返回-1。函数定义为intLi

数据结构之-----二叉树

目录本章内容如下:1:树的相关概念与结构2:二叉树的概念与结构3:二叉树的链式结构与实现文章正式开始,让我们一起学习树吧!!一:树的概念树是一种非线性结构,与我们前面所学的顺序表与链表不同,数据元素的对应是1对多的关系,只有一个根结点,且除了根节点其它的结点有且仅有1个前驱结点(父结点)。我们可以将一棵树看作由很多个结

计算机和编程语言初见

学习程序设计的目的是什么呢?不一定要做出一个软件或系统出来,更重要的是理解计算机是如何工作的以及它的长处和短处。计算机本身是无意识的,因此我们要求它为我们做事时:应该将步骤细化、“直”化(规律化);其实计算机什么也不会,我们必须手把手地教他一步一步的做。而计算机的某个优点也正是如此——听话,你叫它往东它绝不往西。然后我

Stellar Toolkit for MySQL 9.0 Crack 3in1

面向数据库管理员的MySQL工具包StellarToolkitforMySQL是一款三合一软件套件,用于修复损坏的MySQL和MariaDB数据库、从MySQL数据库的InnoDB和MyISAM表恢复数据以及分析MySQL数据库日志文件。该软件还可以以最高的安全性和完整性相互转换MySQL/MariaDB、MSSQL(

【跟晓月学数据库】基于book库的mysql进阶实战

前言上篇文章中,我们已经导入了book库,如果你还没有导入book库,参考:【跟晓月学数据库】使用MySQLdump对数据导入导出这篇文章,主要是基于book库的操作,希望对你有用。🏠个人主页:我是沐风晓月🧑个人简介:大家好,我是沐风晓月,阿里云社区专家博主😉😉💕座右铭:先努力成长自己,再帮助更多的人,一起加

运营商大数据精准营销获客?

多年来,大数据运营商一直致力于为企业提供互联网大数据精准营销的新项目,并以确保自身信息安全为前提。例如,如果移动用户查看了任何网站,在网页上搜索了任何关键词,登录了应用程序,给任何人打了电话,以及隶属地区、性別,所有这些都由运营商存储,那么企业可以提供需求,运营商可以根据客户行为找到准确的意向客户。高质量的新客户可以基

热文推荐