你的职责链模式符合五大原则吗?-系统学习九

简介: 工作之余对于用到的设计模式进行总结再梳理,发现职责链模式的妙处以及五大原则的指导下更能发挥职责链模式的优势于是乎便有了这篇博文的诞生

一、背景介绍


工作之余对于用到的设计模式进行总结再梳理,发现职责链模式的妙处以及五大原则的指导下更能发挥职责链模式的优势于是乎便有了这篇博文的诞生


阅读这篇文章会让小编陪着您一起游历职责链模式,以及体会职责链在五大原则的指导下更大作用的发挥;过程中还会涉及小编的学习过程中的思路、总结以及产生的问题,希望能够和您碰撞出更多的"车祸"。


二、学习思路


1.绘制模式的UML图

2.根据UML图编写代码

3.寻找模式的场景例子进行UML图的绘制

4.根据场景例子的UML图编写代码

5.职责链和五大原则的指导思考


三、学习过程


3.1.概念:


职责链模式(Chain of Responsibility): 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。


3.2.模式uml图


2021071723435934.png


3.3.模式uml图对应代码


/**
 * 功能描述:客户端
 *
 * @Author:makang
 * @Date: 2021/5/27 10:02
 */
public class Client {
    public static void main(String[] args) {
        //实例化节点1
        Handler handler = new ConcreteHandler1();
        //实例化节点2
        Handler handler1 = new ConcreteHandler2();
        //构建链
        handler.setSuccessor(handler1);
        //进行调用
        handler.HandleRequest(20);
    }
}


/**
 * 功能描述:链中节点的抽象类
 *
 * @Author:makang
 * @Date: 2021/5/26 18:00
 */
public abstract class Handler {
    protected Handler successor;
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    public abstract void HandleRequest(int request);
}


/**
 * 功能描述:节点1
 *
 * @Author:makang
 * @Date: 2021/5/27 9:57
 */
public class ConcreteHandler1 extends Handler{
    @Override
    public void HandleRequest(int request) {
        if(request >=0 && request < 10){
            System.out.println("在0-10范围 审批通过");
        }else{
            if(successor != null){
                successor.HandleRequest(request);
                System.out.println("请求是否会返回=============");
            }else {
                System.out.println("已经走到了职责链的最后!!!");
            }
        }
    }
}


/**
 * 功能描述:节点2
 *
 * @Author:makang
 * @Date: 2021/5/27 10:00
 */
public class ConcreteHandler2 extends Handler{
    @Override
    public void HandleRequest(int request) {
        if(request >=10 && request < 50){
            System.out.println("申请在10-50之间审批通过");
        }else{
            successor.HandleRequest(request);
        }
    }
}


3.4.filter拦截器对应的职责链需求


需要实现将请求中的HTML过滤和字符串替换,将最终结果返回


202107172352218.png


3.5.filter拦截器对应的职责链uml图


20210717235302201.png


3.6.filter拦截器对应的职责链代码


import java.util.ArrayList;
import java.util.List;
public class ServletMain {
    public static void main(String[] args) {
        Request request = new Request();
        request.str = "大家好,我是~~;<script>,很高兴能够和大家沟通交流;我们都是007";
        Response response = new Response();
        response.str = "response返回参数";
        //实例化过滤链对象
        FilterChain chain = new FilterChain();
        //给过滤链对象添加过滤对象
        chain.add(new HTMLFilter()).add(new SensitiveFilter());
        //执行过滤方法
        chain.doFilter(request,response,chain);
        System.out.println(request.str);
        System.out.println(response.str);
    }
}
/**
 * filter接口
 */
interface Filter{
    boolean doFilter(Request request,Response response,FilterChain filterChain);
}
/**
 * html过滤filter实现
 */
class HTMLFilter implements Filter{
    @Override
    public boolean doFilter(Request request, Response response, FilterChain filterChain) {
        request.str = request.str.replace("<","[").replace(">","]")+"--HTMLFilter";
        filterChain.doFilter(request,response,filterChain);
        response.str = response.str+"--HTMLFilter";
        return true;
    }
}
/**
 * 请求类
 */
class Request{
    String str;
}
/**
 * 响应类
 */
class Response{
    String str;
}
/**
 * 字符串替换filter实现类
 */
class SensitiveFilter implements Filter{
    @Override
    public boolean doFilter(Request request, Response response, FilterChain filterChain) {
        request.str = request.str.replace("007","0071")+"--SensitiveFilter";
        filterChain.doFilter(request,response,filterChain);
        response.str = response.str+"--SensitiveFilter";
        return true;
    }
}
/**
 *过滤链类
 */
class FilterChain implements Filter{
    //存放过滤对象集合
    List<Filter> filters = new ArrayList<>();
    int index = 0;
    //添加过滤对象方法
    public FilterChain add(Filter filter) {
        filters.add(filter);
        return this;
    }
    //实现根据过滤对象集合顺序进行过滤操作
    @Override
    public boolean doFilter(Request request, Response response, FilterChain filterChain) {
        if(index == filters.size()){
            return false;
        }
        Filter f = filters.get(index);
        index ++;
        return f.doFilter(request,response,filterChain);
    }
}


注:filter自定义拦截器可以通过@Order()注解来设置先后顺序


3.7.扩展


需求


1.如何做到增加链中节点,符合开闭原则?

2.如何做到修改链中节点先后顺序,符合开闭原则?


方案:


1.非spring管理的项目:将链中的下一个节点的包路径放到配置文件中,调用过程中通过读取配置文件的包路径采用反射来获得下一个节点的对象

2.spring管理的项目:将链中的下一个节点的beanName放到配置文件中,调用过程中通过读取配置文件的beanName采用abstractBeanFactory.getBean(str)的方式获取下一个节点的对象


四、学习总结


收获:


1.复习了职责链模式

2.了解了Filter拦截对于职责链模式的运用

3.总结了职责链模式在五大原则指导下发挥的更加突出的作用


提出的问题(问题将在后续博文中解答):


1.职责链和状态模式的对比?

2.职责链和策略模式的对比?


五、升华


所谓天下武功唯快不破,天下代码唯设计模式不立,而设计模式再五大原则的强有力指导下会发挥更加突出的作用。

相关文章
|
18天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
8727 25
|
17天前
|
人工智能 并行计算 PyTorch
秋叶 ComfyUI 2026 整合包 v3.2 完整部署教程:Python 3.13 + Torch 2.13 全栈升级
秋叶aaaki ComfyUI 2026年8月整合包v3.2正式发布!全面升级Python 3.13.11、PyTorch 2.13.0+cu130及ComfyUI v0.30.2,原生支持MiniMax H3、Wan 2.2、Qwen-Image-2.1等2026主流音视频/图像模型,解压即用,无需环境配置。
3279 14
|
17天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2167 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
6天前
|
人工智能 JSON Linux
【全网最详细】ComfyUI使用教程:下载+本地部署+配置+工作流搭建一篇搞定(2026最新版)
ComfyUI是一款免费开源的本地AI绘图工具,采用节点式工作流设计,支持文生图、图生图、局部重绘、放大、换脸等多种功能。可离线运行,依赖显卡加速,无需联网。支持自定义流程保存与分享,插件生态丰富,适合进阶用户。(239字)
|
11天前
|
人工智能 Linux 开发者
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
Codex是OpenAI推出的AI编程智能体,可读取本地项目、理解需求并自动修改代码。支持桌面GUI、命令行(CLI)及VS Code/Cursor插件三种形态,覆盖可视化操作、终端高效开发与编辑器无缝集成场景,助开发者用自然语言驱动编码全流程。(239字)
【2026国内使用】Codex安装过程一篇讲透(Win/Mac/Linux全支持)
|
17天前
|
云安全 人工智能 安全
|
3天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
338 1
|
6天前
|
人工智能 Linux Windows
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面
千问办公(QwenWork)是阿里云推出的AI智能办公平台,支持网页端直接使用及Windows/Mac/Linux客户端下载。提供PPT生成、财报分析、网页搭建等AI功能,个人版免费,企业版198元/席/月。详情见官网qwenwork.cn或阿里云产品页。
770 0
千问办公(QwenWork)官网入口:其实有2个,一个是网页端千问办公,一个是介绍指南页面