常见几种设计模式之职责链模式

目录
一、创建型
1.单例模式
2.工厂模式
3.原型模式
二、结构型
1.享元模式
2.代理模式
三、行为型
1.模板模式
2.职责链模式
(1)OA系统采购案例
(2)职责链模式
(3)SpringMVC-HandlerExecutionChain
(4)总结

(1)OA系统采购案例

1.学校OA系统的采购审批项目:请设计程序完成采购审批项目

(1)采购员采购教学器材
(2)如果金额小于等于5000,由教学主任审批(0<=x<=5000)
(3)如果金额小于等于10000,由院长审批 (5000 (4)如果金额小于等于30000,由副校长审批(10000 (5)如果金额超过30000以上,有校长审批 (30000

2.传统方案if..else+调用approver存在的问题

(1)若各个级别的审批人员金额发生改变,那么对应的客户端也要改变 ----if.else条件也得改变
(2)采购请求处理和Approver审批人存在强耦合关系,不利于扩展维护


image-20201211155720073.png

(2)职责链模式

1.Chain Of Responsibility

(1)职责链(责任链)模式,属于行为型模式
(2)解耦:对请求者和处理者进行解耦
(3)Handler持有自己:每个处理者都持有下一个包含处理者(nextHandler),也就是自己聚合自己,handler自己无法处理会将自己相同的请求发送到下一个处理器,依次类推形成一条链

2.下方UML类图的角色解释

(1)Handler:抽象处理者,有一个处理请求接口,同时持有下一个Handler(聚合了自己)
(2)ConcreteHandlerA,B:具体的处理者,处理属于"自己职责范围"的请求,如果自己无法处理,交给后继者(请求大佬帮忙解决问题),从而形成职责链模式
(3)Request:表示一个请求

3.补充

(1)双亲委派和这个相反,倒着来!
--除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器.顺序依次是: Bootstrap ClassLoader: 启动类加载器,加载java_home/lib中的类 Extension ClassLoader: 扩展类加载器,加载java_home/lib/ext目录下的类库 Application ClassLoader: 应用程序类加载器,加载用户类路径上指定类库
--双亲委派模型的工作原理:如果一个类加载器受到了类加载请求,它首先不会自己去尝试加载这个类,而把这个请求委派给父类加载器去完成,每一层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成加载请求时,加载器才尝试自己加载.这种方式保证了Oject类在各个加载器加载环境中都是同一个类


image-20201211161224795.png

(3)SpringMVC-HandlerExecutionChain

1.源码分析

(1)SpringMVC请求的流程图中,执行了拦截器的相关方法interceptor.preHandler
---HandlerExecutionChain主要负责请求的处理和调用interceptor执行,本身不处理请求,将请求分给handler处理
---减少职责链本身与处理逻辑的耦合
---HandlerExecutionChain维护了HandlerInterceptor的集合,可以向其中注册相应的拦截器
(2)处理SpringMVC中,使用到职责链模式同时还使用到了适配器模式

2.补充

(1)职责链是否结束由preHandler控制,preHandler返回false,那么职责链就结束了


image-20201211193607180.png

image-20201211194534625.png

(4)总结

1.小结

优点:
(1)解耦:请求和处理分开,实现了解耦,提高系统的灵活性
(2)简化对象:对象无需知道链的结构
缺点
(1)链过长性能问题:链比较长的时候,需要控制链中最大节点数量,可以在Handler设置一个最大节点数量,setNextHandler()中判断是否超过链长度的threshold阈值,超过则不允许链的建立,避免出现链过长导致破坏系统性能
(2)责任链处理类似递归调用,调试逻辑可能比较复杂

2.场景

(1)SpringMvc的拦截链
(2)Netty的NioEventLoop对应的pipeline管道的处理器handler
(3)Tomcat对Encoding的处理,过滤器,拦截器
(4)多级请求,请假/加薪(逐层上报审批)

你可能感兴趣的:(常见几种设计模式之职责链模式)