当前位置: 首页 > 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);
    }
}

相关文章:

  • 请问你怎么看待测试,指导哪些测试的类型,有用过哪些测试方法?
  • 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
  • 湘西网站建设吧/长沙专业竞价优化公司
  • 做视频网站要什么软件有哪些/网址大全下载
  • 北京网站建设公司网络营销外包网络建站报价/2021全国大学生营销大赛
  • 网站被恶意攻击/网站开发流程的8个步骤
  • 怎么做苹果手机网站首页/如何做百度关键词推广
  • 门户网站 意义/网络营销的现状分析