设计模式——职责链(责任链)模式
目录
职责链模式
小俱求实习
结构图
实例
职责链模式优点
职责链模式缺点
使用场景
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()