设计模式(十四)责任链模式

2023-11-05

前面讨论了创建型模式、结构型模式,今天我们来讨论一下行为型模式。责任链模式,就是我们讨论的第一种行为型模式。责任链模式具体不容易说出来,但是如果看一看责任链模式的实际例子就很容易明白了。最典型的例子就是Java EE Servlet中的过滤器,以链式方式对请求进行过滤了。当我们遇到类似需求的时候,也可以使用责任链模式来解决。

下面我们来模拟一下Java Servlet中的Filter。首先,需要请求和响应的接口和实现。这两个接口都很简单。

//请求
public interface Request {
    String getMessage();
}

class RequestImpl implements Request{
private String msg;

    public RequestImpl(String msg) {
        this.msg = msg;
    }

    @Override
    public String getMessage() {
        return msg;
    }
}

//响应
public interface Response {
    String getMessage();
}

class ResponseImpl implements Response {
    private String msg;

    public ResponseImpl(String msg) {
        this.msg = msg;
    }

    @Override
    public String getMessage() {
        return msg;
    }
}

之后是过滤器的接口和实现。过滤器将会对请求和处理进行处理和过滤。过滤器1和2是正常的过滤器,过滤之后还会继续调用链上的其它过滤器。而过滤器3则会直接阻断链。

public interface Filter {
    void doFilter(Request request, Response response, FilterChain chain);
}

class FilterImpl1 implements Filter {

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("In filter1: " + request.getMessage() + ":" + response.getMessage());
        chain.doFilter(request, response);
    }
}

class FilterImpl2 implements Filter {

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("In filter2: " + request.getMessage() + ":" + response.getMessage());
        chain.doFilter(request, response);
    }
}

class FilterImpl3 implements Filter {

    @Override
    public void doFilter(Request request, Response response, FilterChain chain) {
        System.out.println("In filter3: " + request.getMessage() + ":" + response.getMessage());
    }
}

下面来实现责任链。责任链其实和很简单,开始过滤之后,责任链就会不断的调用链上的过滤器,直到某个过滤器判断不需要继续过滤(例如过滤器3)或者链到头为止。为了让这个链能够复用,我还添加了当前调用链的标记current,标记调用到哪里了,再到头之后重新将current设置为0。

class FilterChain {
    private List<Filter> filters;
    private int current;

    public FilterChain(List<Filter> filters) {
        this.filters = filters;
        current = 0;
    }

    void doFilter(Request request, Response response) {
        if (current <= filters.size() - 1) {
            Filter currentFilter = filters.get(current);
            current++;
            currentFilter.doFilter(request, response, this);
        } else {
            current = 0;
        }
    }
}

这样一个责任链就完成了。我们来调用一下。

    public void run() {
        Filter filter1 = new FilterImpl1();
        Filter filter2 = new FilterImpl2();
        List<Filter> filters = new ArrayList<>();
        filters.add(filter1);
        filters.add(filter2);
        FilterChain chain = new FilterChain(filters);

        Request request = new RequestImpl("request1");
        Response response = new ResponseImpl("response1");

        chain.doFilter(request, response);
        System.out.println();

        filters.add(0,new FilterImpl3());
        chain.doFilter(request, response);
    }

结果应该类似这样。和我们的预期相同。

责任链模式
In filter1: request1:response1
In filter2: request1:response1

In filter3: request1:response1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式(十四)责任链模式 的相关文章

随机推荐

  • LSTM模型预测新冠

    LSTM是RNN的改进型 传统RNN模型会随着时间区间的增长 对早期的因素的权重越来越低 有可能会损失重要数据 而LSTM模型通过遗忘门 输入门 输出门三个逻辑 来筛选和保留数据 原理详解可以参考如何从RNN起步 一步一步通俗理解LSTM这
  • (二叉)树的遍历

    树 包括图 在遍历时都存在两种方式 深度优先遍历和广度优先遍历 树 一定有一个根节点 而图 没有根节点 但图中的任意节点都可以作为根节点使用 当然该节点一定要有边 否则没有意义 深度优先遍历 访问当前节点 将当前节点的children作为子
  • spacemacs删除行尾无意义的空格符号

    SPC SPC delete trailing whitespace 或者 SPC x d w
  • 2019年全球安全态度调查:越来越多的受害者向勒索软件支付赎金

    根据网络安全公司CrowdStrike 发布的 2019年全球安全态度调查 的数据 在供应链攻击后 危害黑客以支付赎金的组织总数从14 增长到39 与去年同期相比翻了一番 其中最典型的是英国 2019年 遭受勒索软件攻击并支付勒索赎金的组织
  • fastadmin public js 内 selectpage 联动下拉

    js 页面 define jquery bootstrap backend table form selectpage function undefined Backend Table Form var Controller index f
  • 如何使用Git工具克隆GitHub仓库到本地

    首先 确保你已经在本地安装了Git 如果没有安装 可以前往Git官方网站 https git scm com 下载并安装适合你操作系统的版本 在本地文件夹打开Git Bash 如果你使用Windows系统 在GitHub上找到你想要克隆的仓
  • UE Cook遇到的一些问题

    UE Cook是什么 简单来说 把UE资源 比如uasset umap等转换成平台能识别的资源类型 Cook中遇到的报错 找不到文件 说明你有些plugin没有加入到当前 Project uproject中去 UATHelper Cooki
  • 35岁,一个团队leader,从工作满8年的公司离职,选择重新尝试新机会,或许35岁才是起点。

    目录 面试 1 年龄大找工作一定要有目标 不能太随便 2 代码能力是整个IT行业的核心技能 也是对整个行业从业者的要求 3 沟通表达很重要 把自己做过的事情做到极致 然后能讲出来 4 心态要好 5 机会总是留给有准备的人 勿浮躁 先沉淀 厚
  • 多态语法c++(自学笔记一)

    多态中的纯虚函数 使用多态时 当子类继承父类之后 一般来说对于父类只是作为提供相应的成员变量和成员函数的一个集合 在实际项目中 如果想要修改某一部分的功能 按照以往普通的类的写法 就需要修改类中的代码 也可以说是源码 这样会显得很不方便和不
  • Spring Boot 日志处理

    Spring Boot 日志处理 Spring Boot 是一个非常流行的 Java 开发框架 它提供了简洁的配置和强大的开发工具 日志是应用程序中必不可少的一部分 因为它可以帮助开发人员进行调试和故障排除 Spring Boot 提供了多
  • 非常详细图文JDK和Tomcat安装和配置的图文教程

    想用Tomcat作为服务器 必须分以下两步 首先要配置好JDK的环境变量 再去下载Tomcat的压缩包 一 下载 安装JDK 并且配置好环境变量 1 下载地址 http www oracle com technetwork java jav
  • springboot连接不上redis的三种解决方案

    第一种 查看防火墙是否打开6379端口 查看防火墙状态 systemctl status firewalld 如果防火墙没有启动的话 可以选择直接看后面两种方法 或者就是打开防火墙 然后继续下面的步骤 开启端口 firewall cmd z
  • 基于java网上图书销售系统的设计与实现(含源文件)

    欢迎添加微信互相交流学习哦 项目源码 https gitee com oklongmm biye 1引言 随着Internet国际互联网的发展 越来越多的企业开始建造自己的网站 基于Internet的信息服务 商务服务已经成为现代企业一项不
  • RPMB说明与使用(Replay Protected Memory Block)

    1 什么是RPMB 首先RPMB是repaly protected memory block 从字面意思理解就是一个回放保护的存储区域 这个区域是EMMC或者UFS上的一个区域 这个区域可以读 可以写 但是读和写是受到访问控制和回放保护的
  • 微信的订阅消息发送失败,提示code:47003,msg:argument invalid! data.thing3.value invalid

    问题 通过微信的API发送订阅消息失败了 就是发服务通知 服务通知如下所示 错误提示如下 An highlighted block 2021 07 27 09 23 26 828 INFO xx WechatMsgServiceImpl L
  • 一次因调用文件方法错误导致run.py调用不了test的过程

    我的项目中需要在一个 py中调用另一个文件夹的 py 最开始用的方法是 导入sys包 然后使用sys path append 存储路径 import unittest 导包 from selenium import webdriver fr
  • LeeCode学习记录:20. 有效的括号

    题目及代码 class Solution public boolean isValid String s 1 有效字符串的长度一定为偶数 2 遇到的左括号要先闭合 考虑用栈将这个左括号放入栈顶 3 当右括号时 可以取出栈顶的左括号并判断它们
  • 【EDA软件互转】PADS转Allegro

    1 使用pads软件打开PCB文件 然后执行菜单命令 File gt Export gt 弹出的对话框中点击 保存 然后按下图设置后点击 OK 按钮 会在当前目录下生成一个前面保存的asc文件 如果点击OK后有弹出其它提示就点击 确定 就好
  • 1980-2010年道路数据shp、2020年GRIP Global Roadsshp、2018年全国道路数据集shp、OSM数据shp

    道路数据集 一 NASA道路数据 1 数据来源 NASA 2 时间跨度 1980 2010 取决于国家 3 区域范围 亚洲 4 指标说明 数据格式 shp矢量数据 平面坐标系 WGS 84 全球公路开放获取数据集 1980 2010 第一版
  • 设计模式(十四)责任链模式

    前面讨论了创建型模式 结构型模式 今天我们来讨论一下行为型模式 责任链模式 就是我们讨论的第一种行为型模式 责任链模式具体不容易说出来 但是如果看一看责任链模式的实际例子就很容易明白了 最典型的例子就是Java EE Servlet中的过滤