详解设计模式:责任链模式

news2024/9/22 15:33:55

责任链模式(Chain of Responsibility Pattern)也被称为职责链模式,是在 GoF 23 种设计模式中定义了的行为型模式。

责任链模式 是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。

责任链模式 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

本篇文章内容包括:关于责任链模式、责任链模式 Demo(伪代码)、责任链模式 Demo(模拟 FilterChain)


文章目录

    • 一、关于责任链模式
        • 1、关于链式模式
        • 2、关于责任链模式
        • 3、关于责任链模式的构成
        • 4、关于责任链模式的XML
        • 5、关于责任链模式的处理流程
        • 6、关于责任链模式的应用场景
        • 7、关于责任链模式的优缺点
    • 二、责任链模式 Demo(伪代码)
        • 1、伪代码 Demo 实现
        • 2、Demo 测试
    • 三、责任链模式 Demo(模拟 FilterChain)
        • 1、Demo 设计
        • 2、Demo 实现
        • 3、Demo 测试


一、关于责任链模式

1、关于链式模式

首先它可以对同一模块中有先后执行顺序要求的类或对象进行成链,以达到高聚合的目的。同时对于单一执行状态下的执行步骤,可以通过非状态模式的成链方式进行组装,便可以实现改变执行顺序的目的,让代码维护性变高。

2、关于责任链模式

责任链模式(Chain of Responsibility Pattern)也被称为职责链模式,是在 GoF 23 种设计模式中定义了的行为型模式。

责任链模式 是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。

责任链模式 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

3、关于责任链模式的构成

责任链模式主要包含以下 2 种角色:

  • 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个 Java 抽象类或者 Java 接口实现。Handler 类的聚合关系给出了具体子类对下家的引用,抽象方法 handleRequest() 规范了子类处理请求的操作。
  • 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

4、关于责任链模式的XML

image-20221203204424308

5、关于责任链模式的处理流程

image-20221203204403335

6、关于责任链模式的应用场景

  • 职责链模式最常用来开发框架的过滤器和拦截器
  • 多个对象可以处理一个请求,但具体由哪个对象处理该请求在运行时自动确定。
  • 可动态指定一组对象处理请求,或添加新的处理者。
  • 需要在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求。

7、关于责任链模式的优缺点

# 责任链模式的优点

  • 降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。
  • 增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
  • 增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。
  • 责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句。
  • 责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则。

# 责任链模式的缺点

  • 不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理。
  • 对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响。
  • 职责链建立的合理

二、责任链模式 Demo(伪代码)

1、伪代码 Demo 实现

# Handler

public abstract class Handler {

    private Handler next;

    /**
     * 用来设置下一个处理者
     * @param next Handler
     */
    public void setNext(Handler next) {
        this.next=next;
    }
    public Handler getNext() {
        return next;
    }

    /**
     * 处理请求的方法
     * @param request String
     */
    public abstract void handleRequest(String request);
}

# ConcreteHandler

public class ConcreteHandler1 extends Handler {

    @Override
    public void handleRequest(String request) {
        if("one".equals(request))  {
            System.out.println("具体处理者1负责处理该请求!");
        }
        else {
            if(getNext()!=null)  {
                getNext().handleRequest(request);
            }
            else {
                System.out.println("没有人处理该请求!");
            }
        }
    }
}
public class ConcreteHandler2 extends Handler {

    @Override
    public void handleRequest(String request) {
        if("two".equals(request))  {
            System.out.println("具体处理者2负责处理该请求!");
        }
        else {
            if(getNext()!=null) {
                getNext().handleRequest(request);
            }
            else {
                System.out.println("没有人处理该请求!");
            }
        }
    }
}

2、Demo 测试

public class Client {
    public static void main(String[] args) {
        //组装责任链
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setNext(handler2);
        //提交请求
        handler1.handleRequest("two");
    }
}

三、责任链模式 Demo(模拟 FilterChain)

1、Demo 设计

在 JavaWeb 应用开发中,FilterChain 是职责链(过滤器)模式的典型应用,以下是 Filter 的模拟实现分析

2、Demo 实现

# 模拟 web 请求 Request 以及 web 响应 Response

public interface Request{}

public interface Response{}

# Filter 过滤器

public interface Filter {
 		public void doFilter(Request req,Response res,FilterChain c);
}

# FirstFilter 具体过滤器

public class FirstFilter implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {

        System.out.println("过滤器1 前置处理");

        // 先执行所有request再倒序执行所有response
        chain.doFilter(request, response);

        System.out.println("过滤器1 后置处理");
    }
}

public class SecondFilter  implements Filter {
    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {

        System.out.println("过滤器2 前置处理");

        // 先执行所有request再倒序执行所有response
        chain.doFilter(request, response);

        System.out.println("过滤器2 后置处理");
    }
}

# FilterChain 过滤器链

public class FilterChain {

    private List<Filter> filters = new ArrayList<Filter>();

    private int index = 0;

    // 链式调用
    public FilterChain addFilter(Filter filter) {
        this.filters.add(filter);
        return this;
    }

    public void doFilter(Request request, Response response) {
        if (index == filters.size()) {
            return;
        }
        Filter filter = filters.get(index);
        index++;
        filter.doFilter(request, response, this);
    }
}

3、Demo 测试

public class Client {
    public static void main(String[] args) {
        Request  req = null;
        Response res = null ;

        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter());
        filterChain.doFilter(req,res);
    }
}

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

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

相关文章

降温了好冷,总结下11月

1、这两天广东气温骤降&#xff0c;出门必须加外套了&#xff0c;emmm&#xff0c;不想出门&#xff0c;各位宝宝注意保暖吖&#xff0c;别感冒了。2、这边疫情开始放开了&#xff0c;备好感冒药&#xff0c;锻炼身体&#xff0c;做好预防&#xff0c;靠自己了。3、11月过的真快…

jsp人事考勤管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 人事考勤管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式 开发。开发环境为TOMCAT7.0,Myeclipse8.…

[附源码]计算机毕业设计基于Springboot的花店售卖系统的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【45-线程的实现方式-线程池的创建方式-线程池的执行顺序-CompletableFutrue异步处理】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

物联网毕设 -- 基于STM32的心率检测

目录 前言 1 演示视频 一 连线图 1. 原理图 2.功能概括 二 底层代码使用方式 1. 下载程序 2. 查看云平台数据 三 APP使用方式 1. 下载APP 2. 配对蓝牙 四 网盘链接 前言 分享一个之前做到心率监测项目&#xff0c;有APP端有OLED显示端&#xff0c;我会把把他放…

Windows搭建web站点:免费内网穿透发布至公网 1-2

什么是cpolar&#xff1f; cpolar是一个非常强大的内网穿透工具&#xff0c;开发调试的必备利器。 它可以将本地内网服务器的HTTP、HTTPS、TCP协议端口映射为公网地址端口&#xff0c;使得公网用户可以轻松访问您的内网服务器&#xff0c;无需部署至公网服务器。支持永久免费使…

[附源码]Python计算机毕业设计Django软考刷题小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

ssm项目整合,简单的用户管理系统

ssm项目整合&#xff0c;简单的用户管理系统项目概述项目搭建创建项目1.创建maven项目2.导入项目依赖及maven资源过滤设置3.添加web支持4.配置tomcat5.配置web发布依赖jar包6.数据库的表创建7.实体类创建7.1 lombok常用注解:dao层1.daoMapper接口创建2.Mapper.xml配置文件3.myb…

物联网iot全称

物联网iot的发展 麻省理工学院Ashton教授1999年研究RFID时最早提出物联网(Internet of Things&#xff0c; IoT)这个概念。Sun公司在2003年发表文章介绍物联网的基本工作流程&#xff0c;并提出解决方案。 IoT的意思是物联网&#xff0c;全称为Internet of Things。是指通过射…

狂神说Spring学习笔记

一、Spring 1.1 简介 Spring&#xff1a;春天------>给软件行业带来了春天&#xff01;2002&#xff0c;首次推出了Spring框架的雏形&#xff1a;interface21框架&#xff01;Spring框架即以interface21框架为基础&#xff0c;经过重新设计&#xff0c;并不断丰富其内涵&a…

metaRTC新增SRS的WebRTC over TCP和turn的TCP支持

概述 在很多网络条件下&#xff0c;防火墙会阻止UDP传输&#xff0c;因此webRTC TCP的支持就很重要&#xff0c;metaRTC提供了SFU和P2P的支持。 SFU支持SRS的webRTC over TCP&#xff0c;P2P支持turn的TCP。 源代码下载 GitHub - metartc/metaRTC: A cross-platform WebRTC…

[附源码]计算机毕业设计基于SpringBoot的小说阅读系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

8.softmax回归

1. 关于回归和多类分类 分类问题从回归的单输出变成了多输出&#xff0c;这个多输出的个数类别的个数 置信度&#xff1a;置信度一词来自统计学&#xff0c;而统计学的本质是&#xff0c;用抽样的数据去估计整体的真实分布。例如&#xff0c;样本均值估计整体均值&#xff1b;还…

基于WEB的在线选课系统(asp.net)

目  录 摘要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 目的和意义 1 1.3 系统设计思想 2 第2章 可行性分析 3 2.1 管理可行性 3 2.2 经济可行性 4 2.2.1 系统初期投资 4 2.2.2 系统货币的时间价值 4 2.2.3 投资回收期 5 2.2.4 纯收入 5 2.3 技术可行性 5 2…

Java8从入门到精通 笔记

Lambda表达式 匿名内部类 我们可以用匿名内部类来比较两个Integer参数的大小 Comparator<Integer> com new Comparator<Integer>() {Overridepublic int compare(Integer o1, Integer o2) {return Integer.compare(o1, o2);} };TreeSet<Integer> treeSet…

接口幂-全面详解(学习总结---从入门到深化)

目录 接口设计与重试机制引发的问题 什么是幂等性 为什么会产生接口幂等性问题 幂等性接口设计 如何保证接口幂等性 接口设计与重试机制引发的问题演示_项目搭建 创建项目 选择框架 修改SpringBoot版本 创建用户表 代码生成 引入依赖 编写代码生成类 接口设计与重试机制引…

Scaling Up Your Kernels to 31x31: Revisiting Large Kernel Design in CNNs笔记

论文地址&#xff1a;https://arxiv.org/pdf/2203.06717.pdf 代码地址&#xff1a;https://github.com/MegEngine/RepLKNet 目录 论文地址&#xff1a;https://arxiv.org/pdf/2203.06717.pdf 代码地址&#xff1a;https://github.com/MegEngine/RepLKNet Abstract 1. Introd…

MySQL架构MMM

官网地址&#xff1a; Multi-Master Replication Manager for MySQL [MMM for MySQL Wiki] 简介 MMM&#xff08;Master-Master replication manager for MySQL&#xff09;是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发&#xff0c;主要用来监控和…

Kafka - 14 Kafka分区的分配策略及再平衡 | Range | RoundRobin | Sticky | CooperativeSticky

文章目录1. 分区的分配以及再平衡2. Range 分区分配以及再平衡3. RoundRobin 分区分配以及再平衡4. Sticky 分区分配以及再平衡1. 分区的分配以及再平衡 一个consumer group中有多个consumer组成&#xff0c;一个 topic有多个partition组成&#xff0c;现在的问题是&#xff0…

[Windows驱动开发] BlackBone介绍

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 名词解释2️⃣ 介绍3️⃣ 库包含内容4️⃣ 编译问题总结常见问题fatal error LNK1104非类型模板参数中的 "auto" &#x1f4d6; 参考资料&#x1f6eb; 导读 需求 作为Windows开发人员&#xff0c;经常遇到枚举进程、…