责任链模式在java中的实现

news/2024/5/19 12:28:21 标签: java, 责任链模式, 设计模式

1 总览

2 概念

避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。

3 实现 

公共部分,一个系统仅需要一个

3.1 责任链传递的数据,所有对象实现该接口

/**
 * 真正存储着责任链的数据
 */
public interface ProcessModel {

}

3.2 责任链上下文,包含请求和返回结果(结果代码中自定义),中断标识等

public class ProcessContext<T extends ProcessModel> {

    /**
     * 存储责任链上下文具体请求数据
     */
    private T processModel;

    /**
     * 责任链中断的标识
     */
    private Boolean needBreak;

    /**
     * 每个链路处理的结果
     */
    XXXResponse response;

    public T getProcessModel() {
        return processModel;
    }

    public void setProcessModel(T processModel) {
        this.processModel = processModel;
    }

    public Boolean getNeedBreak() {
        return needBreak;
    }

    public void setNeedBreak(Boolean needBreak) {
        this.needBreak = needBreak;
    }

    public XXXResponse getResponse() {
        return response;
    }

    public void setResponse(XXXResponse response) {
        this.response = response;
    }
}

3.3 抽象责任链接口

public interface AbstractChainProcessor<T extends ProcessModel> {

    void processRequest(ProcessContext<T> request);
}

3.4 责任链具体实现(多个,按需实现)

3.5 责任链组装

/**
 * @author sighting
 * @version 1.0.0.0
 * @description: 消息发送处理模版
 * @date 2022/12/1 4:11 下午
 */

public class ProcessTemplate {

    private List<AbstractChainProcessor> processList;

    public List<AbstractChainProcessor> getProcessList() {
        return processList;
    }

    public void setProcessList(List<AbstractChainProcessor> processList) {
        this.processList = processList;
    }

}

调用方组装责任链(非公共部分,按需实现),设置链执行顺序,当然也可以每个对象中设置责任链的下游对象,具体实现为,在抽象责任链中增加第二段代码

public ProcessTemplate getAsseblyChain(String exeMode) {
        ProcessTemplate processTemplate = new ProcessTemplate();
        MessageSendModeEnum sendMode = MessageSendModeEnum.getByName(exeMode);
        BizValidation.isTrueBCheck(MessageResultCode.SEND_MODE_NOT_SUPPORT, sendMode != null,null);
        if (MessageSendModeEnum.SYNC.getCode() == sendMode.getCode()) {
            processTemplate.setProcessList(Arrays.asList(xxxx,xxxx));
        } else {
            processTemplate.setProcessList(Arrays.asList(xxx,ssss,needed));
        }
        return processTemplate;
    }
//维持对下家的引用
protected Handler successor;
public void setSuccessor(Handler successor) {
		this.successor=successor;
}

3.6 使用实例:责任链具体使用

         //责任链入参
        ProcessContext<MessageSendReqBO> processContext = new ProcessContext<>();
        processContext.setProcessModel(reqBO);
        processContext.setNeedBreak(false);
        processContext.setResponse(new SimbaResponse());
        try {
            //责任链处理
            for (AbstractChainProcessor businessProcess : 上个方法.getAsseblyChain(reqBO.getExecMode()).getProcessList()) {
                businessProcess.processRequest(processContext);
                if (processContext.getNeedBreak()) {
                    break;
                }
            }
         } catch (Exception e) {
            log.error("chains exe failed",e)
         }


http://www.niftyadmin.cn/n/5356864.html

相关文章

vit细粒度图像分类(七)TBNet学习笔记

1.摘要 细粒度鸟类图像识别致力于实现鸟类图像的准确分类&#xff0c;是机器人视觉跟踪中的一项基础性工作。鉴于濒危鸟类的监测和保护对保护濒危鸟类具有重要意义&#xff0c;需要采用自动化方法来促进鸟类的监测。在这项工作中&#xff0c;我们提出了一种新的基于机器人视觉…

【DeepLearning-8】MobileViT模块配置

完整代码&#xff1a; import torch import torch.nn as nn from einops import rearrange def conv_1x1_bn(inp, oup):return nn.Sequential(nn.Conv2d(inp, oup, 1, 1, 0, biasFalse),nn.BatchNorm2d(oup),nn.SiLU()) def conv_nxn_bn(inp, oup, kernal_size3, stride1):re…

网络层 IP协议(1)

前置知识 主机:配有IP地址,但是不进行路由控制的设备 路由器:既配置了IP地址,又能进行路由控制的设备 节点:主机和路由器的总称 IP协议主要完成的任务就是 地址管理和路由选择 地址管理:使用一套地址体系,将网络设备的地址描述出来 路由选择:一个数据报如何从源地址到目的地址 …

AIGC专题:生成式AI(GenAI)赋能供应链之路

今天分享的是AIGC系列深度研究报告&#xff1a;《AIGC专题&#xff1a;生成式AI&#xff08;GenAI&#xff09;赋能供应链之路》。 &#xff08;报告出品方&#xff1a;Gartner&#xff09; 报告共计&#xff1a;46页 什么是生成式人工智能 ChatGPT&#xff1a;一种OpenAI服…

Linux 文件IO

目录 linux下的文件分类&#xff1a; 文件描述符原理&#xff1a;&#xff08;底层原理&#xff0c;可跳过&#xff09; 虚拟文件系统&#xff1a; 内存中的inode与磁盘中的inode open函数 函数原型&#xff1a; 形参列表&#xff1a; 代码&#xff1a; close函数 er…

力扣hot100 组合总和 回溯 剪枝 组合

Problem: 39. 组合总和 文章目录 思路复杂度&#x1f496; Code 思路 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f496; Code class Solution{List<List<Integer>> res new ArrayList<>();int x;// 全局targetin…

【代码随想录19】235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

目录 235.二叉搜索树的最近公共祖先题目描述参考代码 701.二叉搜索树中的插入操作题目介绍参考代码 450.删除二叉搜索树中的节点题目描述参考代码 235.二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖…

中国历年大学招生人数【1949年-2021年】-探数API数据分享

中国每年大约有多少学生被我国的高等教育机构录取呢&#xff1f; 在2021年&#xff0c;在我国普通高校被录取的学生数量达到了近1119万人&#xff0c;这个数字比上一年增长了40.9万人。其中&#xff0c;研究生的招生人数为117.65万人&#xff0c;普通本科&#xff08;包括专科…