设计模式——职责链(责任链)模式

news2024/11/23 1:19:40

目录

职责链模式

小俱求实习

结构图

实例

职责链模式优点

职责链模式缺点

使用场景

1.springmvc流程

​2.mybatis的执行流程

3.spring的过滤器和拦截器


职责链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

 一个请求有多个对象可以处理,但每个对象的处理条件或权限不同,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

概念可能不容易理解,我先举一个例子说说亲身体会的一件事,就叫小俱求实习吧。

小俱求实习

背景:2024上半年  小俱正值大三下学期

在这个92✌到处出没的社会市场下,双非一本的小俱心感没有任何优势,苦苦找实习,实习要求虽说没有秋招正式高,在苦苦投递十几大厂下,做测评、做笔试.....不知今年大厂对双非学历究竟如何评估,终于小俱迎来了美团、腾讯云智、游族的面试......每次面试后,小俱深知自己哪块还没有学到位,甚至有的问题没有听过,小俱最终进入人才池。双非就真的菜吧......小俱仍不甘心,继续沉淀......

最终小俱通过boss投递小厂,甘心为公司做牛做马,同时马不停蹄的巩固知识,通过二面,收到了北京一家实习offer,接着有重庆、成都。

小俱满怀期待,兴致勃勃去给辅导员请假!(划重点!)

在辅导员要求提交几种资料后

辅导员回复:我这里只能批准3天假期,你出去实习这件事必须和领导商量。

好,小俱等待批假......

过了一天,辅导员说:领导说他只能批7天假,有的课程还没有完,你这每周需要回来一次,经过我们的开会,批准不同意。

啊!小俱说那我每周请假,每周回来,辅导员仍不同意!

小俱苦苦说机会来之不易,希望领导理解通融!

辅导员其实仅仅传达了领导的命令,理智的小俱不麻烦年轻的辅导员,直接自己找领导。

于是小俱亲自找到领导: 

领导:我这个只能批7天的假,根据目前的教学管理,不允许实习,再说,你实习地点离学校远,每次请7天假也不现实,你这个就属于请长假,你需要找大领导,他同意就行!

小俱人不罢休,去找大领导!

大领导:根据目前的教学管理规定,大三不允许实习............(此处省略各种理由,态度好,很委婉),我们非常支持你们实习,你们有这种意识也非常好,我很支持!(.....好,说了很多,就是不给假。。。)

最终小俱实习失败。

小俱一级一级的找领导,最终失败,但小俱调整心态,继续沉淀。

现在大概理解了职责链模式了吧!

结构图

实例

结构图,举例请假、加薪场景

管理者抽象类  Manager 

//管理者抽象类
abstract class Manager {
    protected String name;

    public Manager(String name) {
        this.name = name;
    }

    //设置管理者上级
    protected Manager superior;

    public void setSuperior(Manager superior){
        this.superior = superior;
    }

    //请求申请
    public abstract void requsetApplications(Request request);

}

 申请Request类

//申请
class Request{
    //申请类别
    private String requestType;
    //申请内容
    private String requestContent;
    //数量
    private int number;

    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    public void setRequestContent(String requestContent) {
        this.requestContent = requestContent;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getRequestType() {
        return requestType;
    }

    public String getRequestContent() {
        return requestContent;
    }

    public int getNumber() {
        return number;
    }
}

普通经理 CommonManager 

//普通经理
class  CommonManager extends Manager{

    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void requsetApplications(Request request) {
        if (request.getRequestType()=="请假"&& request.getNumber()<=2){
            System.out.println(this.name+":"+request.getRequestContent()+"数量:"+ request.getNumber()+"天,批准");
        }else {
            if (this.superior!=null){
                this.superior.requsetApplications(request);
            }
        }
    }
}

 总监Director 

//总监
class  Director extends Manager{

    public Director(String name) {
        super(name);
    }

    @Override
    public void requsetApplications(Request request) {
        if (request.getRequestType()=="请假"&&request.getNumber()<=5){
            System.out.println(this.name+":"+request.getRequestContent()+"数量:" + request.getNumber()+"天,批准");
        }else {
            if (this.superior!=null){
                this.superior.requsetApplications(request);
            }
        }
    }
}

总经理GeneralManager  

//总经理  都会处理
class GeneralManager extends Manager{

    public GeneralManager(String name) {
        super(name);
    }

    @Override
    public void requsetApplications(Request request) {
        if (request.getRequestType()=="请假"){
            System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"天,批准");
        }else if (request.getRequestType()=="加薪"&&request.getNumber()<=5000){
            System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,批准");
        }else if (request.getRequestType()=="加薪"&&request.getNumber()>5000){
            System.out.println(this.name+":"+request.getRequestContent()+"数量:"+request.getNumber()+"元,再说吧");
        }
    }
}

 客户端:

class Test{
    public static void main(String[] args) {
        CommonManager manager = new CommonManager("经理");
        Director director = new Director("总监");
        GeneralManager generalManager = new GeneralManager("总经理");
        //设置每个级别的上级
        manager.setSuperior(director);
        director.setSuperior(generalManager);

        Request request = new Request();
        request.setRequestType("请假");
        request.setRequestContent("小菜请假");
        request.setNumber(1);
        manager.requsetApplications(request);

        Request request2 = new Request();
        request2.setRequestType("请假");
        request2.setRequestContent("小菜请假");
        request2.setNumber(4);
        manager.requsetApplications(request2);

        Request request3 = new Request();
        request3.setRequestType("加薪");
        request3.setRequestContent("小菜加薪");
        request3.setNumber(1000);
        manager.requsetApplications(request3);

        Request request4 = new Request();
        request4.setRequestType("加薪");
        request4.setRequestContent("小菜加薪");
        request4.setNumber(6000);
        manager.requsetApplications(request4);
    }
}

 运行结果

职责链模式优点

「降低了对象之间的耦合度」

责任链模式让发送者不需要知道对方的具体是哪个处理者处理请求。

「增强了系统的可扩展性」

可以根据需要增加新的请求处理类,满足开闭原则。

「增强了给对象指派职责的灵活性」

当工作流程发生变化,客户端可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任。

「责任链简化了对象之间的连接」

每个对象只需保持一个指向其后继者的引用。

「责任分担」

每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成。

职责链模式缺点

  • 不能保证每个请求一定被处理。由于一个「请求没有明确的接收者」,该请求可能一直传到链的末端都得不到处理。
  • 当责任链比较长的时候,请求的处理可能涉及多个处理对象,系统性能受影响。
  • 职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会造成循环调用。

使用场景

1.springmvc流程

就拿这个springMvc的执行流程来说,全部流程就组成了一个链条。每一个步骤就是一个结点,每个结点都会有对应的处理方法,每个结点处理完成之后,就会进入下一个结点。一旦某个结点出现异常,那么当前的链路就会停止,当前请求中断。

2.mybatis的执行流程

mybatis的执行流程也是通过这个责任链模式,如首先会创建这个SqlSessionFactory,然后通过这个工厂创建一个SqlSession,这个SqlSession只是一个门面模式,会通过Executer执行增删改查的操作,然后一个Handler用于设置参数,一个Handler用于返回结果集,最后通过这个StatementHandler将执行结果获取。里面的整个步骤就相当于形成了一个链条,执行完当前结点就会进入下一个结点,如果出现异常,链条终止往下执行。

3.spring的过滤器和拦截器

spring里面的这个过滤器链路的调用,以及拦截器的链路调用,也是采用这种责任链模式

 

 

参考文章:http://t.csdnimg.cn/rkTNL

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么清理C盘空间?5个清理方法要掌握好!

“我的电脑太满了&#xff0c;想清理一下电脑&#xff0c;但是根本不知道怎么操作&#xff0c;有什么方法可以快速清理c盘空间吗&#xff1f;希望大家给我出出主意&#xff01;” 随着电脑使用时间的增长&#xff0c;C盘&#xff08;通常是系统盘&#xff09;的空间会逐渐被占用…

Web开发——HTMLCSS

1、概述 Web开发分前端开发和后端开发&#xff0c;前端开发负责展示数据&#xff0c;后端开发负责处理数据。 HTML&CSS是浏览器数据展示相关的内容。 1&#xff09;网页的组成部分 文字、图片、音频、视频、超链接、表格等等 2&#xff09;网页背后的本质 程序员写的前端…

如何确定SolidWorks文件是哪个版本的软件创建

由于 SolidWorks 低版本无法打开高版本的文件&#xff0c;我们有时候从网络上下载一些模型时可能现当前的 SolidWorks 版本无法打开模型的问题&#xff0c;这时候具需要确定模型究竟是哪个版本的以便于我们安装相应的版本或高版本的 SolidWorks。 那么我们就需要方法确定如何查…

Autodl服务器中Faster-rcnn(jwyang)训练自己数据集(二)

前言 上一章中完成了faster-rcnn(jwyang版本)的复现&#xff0c;本节将在此基础进一步训练自己的数据集~ 项目地址&#xff1a;https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 复现环境&#xff1a;autodl服务器python3.6cuda11.3Ubuntu20.04Pytorch1.10.0…

Android应用URI调起百度地图、高德地图 和 腾讯地图

1、百度地图 地图调起API | 百度地图API SDKhttps://lbs.baidu.com/faq/api?titlewebapi/uri/andriod例&#xff1a;反向地址解析 //反向地址解析URI private final String BAIDU_MAP_NAVI_URI "baidumap://map/geocoder?location";/*** 跳转百度地图*/ private…

基于.NetCore和ABP.VNext的项目实战二:Swagger

Mag.Blog.Swagger层添加Volo.Abp.AspNetCore和Swashbuckle.AspNetCore包,引用实体层.Domain 添加模块类MagBlogSwaggerModule.cs,依赖MagBlogDomainModule模块,并且重写ConfigureServices和OnApplicationInitialization方法 namespace Mag.Blog.Swagger {[DependsOn(typeof…

LeetCode刷题之HOT100之找到数组中消失的数字

2024/5/24 今天早上没有下雨&#xff0c;太好了。下周就要搬到二楼会议室开发了&#xff0c;很多计划都要被打破了。事已至此&#xff0c;先做题吧! 2、逻辑分析 题目的要求是&#xff1a;给定一个长度为n的整数数组nums&#xff0c;要输出在[1&#xff0c;n]范围内但没有出现…

Docker 开启 SSL 验证

最近看 OJ 项目的远程开发阶段&#xff0c;然后踩坑踩了 2 天&#x1f602; Docker 版本&#xff1a;在 CentOS 安装 sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io Client: Docker Engine - CommunityVersion: 20.10.9API version: …

本机与华为云ping不通的问题

进入华为云控制台。依次选择&#xff1a;云服务器->点击服务器id->安全组->更改安全组->添加入方向规则&#xff0c;添加一个安全组规则&#xff08;ICMP&#xff09;&#xff0c;详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP…

浏览器输入URL到网页显示之间发生了什么

记&#xff1a; DNS(Domain Name System,域名系统)就是根据域名来查找对应的IP地址的一个关键系统。 域名层级关系&#xff1a; 根域名服务器&#xff08;.&#xff09;顶级域名服务器&#xff08;.com&#xff09;权威域名服务器&#xff08;server.com&#xff09; 首先浏…

超简单白话文机器学习-朴素贝叶斯算法(含算法讲解,公式全解,手写代码实现,调包实现

1. 朴素贝叶斯算法 朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法是一类基于贝叶斯定理的简单而强大的概率分类器&#xff0c;它在假设特征之间相互独立的前提下工作。尽管这种“朴素”的假设在现实中很少成立&#xff0c;但朴素贝叶斯分类器在许多实际应用中表现良好&am…

灌区信息化管理系统助力灌区节水,打造绿色生态新农业

在现代化农业发展的浪潮中&#xff0c;如何实现节水、高效、绿色的农业生产成为了人们关注的焦点。智慧灌区信息化系统应运而生&#xff0c;以其独特的技术优势&#xff0c;助力灌区节水&#xff0c;打造绿色生态新农业&#xff0c;引领农业生产的未来。 灌区信息化管理系统&am…

高中数学:平面向量-题型总结及解题思路梳理

一、知识点及解题思路梳理 高中&#xff0c;2/3的向量题目是坐标向量题&#xff0c;1/3是几何向量题。但是&#xff0c;这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2

LabVIEW波纹补偿器无线监测系统

LabVIEW波纹补偿器无线监测系统 在石油化工、冶金及电力等行业中&#xff0c;波纹补偿器作为一种重要的补偿性元件&#xff0c;其安全稳定的运行对管道输送系统的可靠性至关重要。开发了一种基于LabVIEW的波纹补偿器无线监测系统&#xff0c;通过实时监测波纹补偿器的工作状态…

Kubernetes的灵魂核心:kube-scheduler

Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。在Kubernetes集群中&#xff0c;kube-scheduler是一个至关重要的组件&#xff0c;它负责将Pod&#xff08;Kubernetes中的最小部署单元&#xff0…

Dom树和渲染树的细微差别,你能分清吗?

DOM树和渲染树都是浏览器渲染页面时生成的树形结构&#xff0c;但它们有一些区别。 1. DOM树&#xff1a; DOM树是由HTML解析器解析HTML文档生成的&#xff0c;它是文档的结构化表示&#xff0c;包含了HTML文档中的所有元素节点、文本节点、注释节点等&#xff0c;它是一个包…

“AI+综合节能改造”:打造数据中心热管理系统节能“秘籍”

维谛技术服务&#xff1a; 欧小明 曲鑫 当前&#xff0c;基于AI技术在确保精准制冷、实现节能和提升运营效率方面的重要作用&#xff0c;将AI技术与热管理系统改造相结合&#xff0c;实现深度协同&#xff0c;是数据中心节能改造的关键路径之一。 “AI综合节能改造”提升热管…

从ES5迈向ES6:探索 JavaScript 新增声明命令与解构赋值的魅力

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…

51单片机入门:红外遥控

红外遥控系统简介 红外遥控系统是利用红外光进行通信的设备&#xff0c;通常由发射和接收两大部分组成&#xff0c;即&#xff1a;由红外LED将调制后的信号发出&#xff0c;再由专门的红外接收头进行解调输出。 红外LED&#xff1a;外表与普通的LED没有什么不同&#xff0c;发…

解锁合同管理的新路径:低代码与定制开发的完美结合

引言 合同管理在企业中扮演着至关重要的角色。无论是与供应商、客户还是合作伙伴之间的合作&#xff0c;合同都是约束双方责任和权利的关键文档。然而&#xff0c;随着业务的不断增长和全球化的发展&#xff0c;合同管理变得越来越复杂。传统的合同管理方法往往面临着诸多挑战&…