当前位置: 首页 > news >正文

设计模式简述(十)责任链模式

责任链模式

  • 描述
    • 基本使用
    • 使用

描述

如果一个请求要经过多个类似或相关处理器的处理。
可以考虑将这些处理器添加到一个链上,让请求逐个经过这些处理器进行处理。

通常,在一个业务场景下会对整个责任链进行初始化,确定这个链上有哪些Handler

关于一个handler处理请求后,请求如何流转通常有几种处理方式:

  • handler有匹配条件
    • 一旦匹配一个handler完成处理后直接返回 后续handler 不会处理i请求
    • 无论是否匹配都执行完整个责任链
  • handler没有匹配条件
    • 这种没有匹配条件的链通常是执行整个责任链

基本使用

这里以有条件匹配,只执行一个handler后就返回的方式举例
匹配的条件通常包含在请求参数中,用于与每个Handler内条件匹配

这里参数就简单定义一个类,不提抽象层了

  • 请求参数
public class HandleRequest {
    private String type;
    private Object data;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "HandleRequest{" +
                "type='" + type + '\'' +
                ", data=" + data +
                '}';
    }
}

  • 抽象Handler
public abstract class AbstractHandler {
    private AbstractHandler nextHandler;

    public final void handleRequest(HandleRequest request) {
        if (Objects.equals(handleType(), request.getType())) {
            this.handle(request);
        } else {
            if (this.nextHandler != null) {
                this.nextHandler.handleRequest(request);
            } else {
                System.out.println("请求未匹配到Handler...");
            }
        }
    }

    public void setNext(AbstractHandler handler) {
        this.nextHandler = handler;
    }

    protected abstract String handleType();

    protected abstract void handle(HandleRequest request);
}
  • 具体Handler
public class HandlerA extends AbstractHandler {
    @Override
    protected String handleType() {
        return "typeA";
    }

    @Override
    protected void handle(HandleRequest request) {
        System.out.println("HandlerA 处理请求: " + request);
    }
}

public class HandlerB extends AbstractHandler {
    @Override
    protected String handleType() {
        return "typeB";
    }

    @Override
    protected void handle(HandleRequest request) {
        System.out.println("HandlerB 处理请求: " + request);
    }
}

使用

在实际使用中,可以将责任链的初始化动作放到具体业务类中,返回第一个Handler给调用者即可
然后将请求委托给责任链。

这里就直接在调用方 进行初始化

public class Sample {
    public static void main(String[] args) {
        AbstractHandler handlerA = new HandlerA();
        AbstractHandler handlerB = new HandlerB();
        handlerA.setNext(handlerB);
        HandleRequest request = new HandleRequest();
        request.setType("typeB");
        request.setData("data.....");
        handlerA.handleRequest(request);
    }
}
http://www.dtcms.com/a/114837.html

相关文章:

  • 请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?
  • Nmap全脚本使用指南!NSE脚本全详细教程!Kali Linux教程!(六)
  • 人脸识别系统(人脸识别、前后端交互、Python项目)
  • 初识数据结构——Java集合框架解析:List与ArrayList的完美结合
  • 如何判断JVM中类和其他类是不是同一个类
  • Window进程监控工具,能自动重启进程和卡死检测
  • 【Linux篇】基础IO - 文件描述符的引入
  • Spring 中的 @Autowired 和 @Resource
  • 用Scala玩转Flink:从零构建实时处理系统
  • L2-046 天梯赛的赛场安排 #二次手写cmp比较函数 这个模拟思路太神了
  • Nginx 负载均衡案例配置
  • [蓝桥杯青少年组省赛 2024] 通关游戏的最少能量值
  • 13-产品经理-产品多分支平台管理
  • 设计模式简述(九)命令模式
  • 【统计方法】降维方式;pca, t-sne, mds
  • 浙江西湖游记
  • TLS协议详解
  • 关于AI大模型的一些理解
  • 基于 Spring Boot 瑞吉外卖系统开发(一)
  • 从扩展黎曼泽塔函数构造物质和时空的结构-16
  • PyTorch 实现图像版多头注意力(Multi-Head Attention)和自注意力(Self-Attention)
  • 棋盘问题(DFS)
  • 【文献研究】含硼钢中BN表面偏析对可镀性的影响
  • 使用OpenSceneGraph生成3D数据格式文件
  • 经典回溯问题———组合的输出
  • CentOS 部署 Nodejs
  • java面试篇 Redis+MySQL+Spring
  • 【C/C++】滑动谜题(leetcode T773)
  • Transformer架构
  • 【ARTS】2873.有序三元组中的最大值!