springboot责任链模式_架构轻松学--JAVA责任链模式
概念
⼀个请求由多个对象来处理,这些对象是⼀条链,但具体由哪个对象来处理,根据条件判断来确定,如果不能处理会传递给该链中的下⼀个
对象,直到有对象处理它为⽌。
使⽤场景
有多个对象可以处理同⼀个请求,具体哪个对象处理该请求待运⾏时刻再确定。
在不明确指定接受者的情况下,向多个对象提交⼀个请求。
可动态指定⼀组对象处理请求,客户端可以动态创建职责链来处理请求。
UML结构图
将接收者对象连成⼀条链,并在该链上传递请求,直到有⼀个接收者对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接
收者之间的耦合。
代码⽰例
案例⼀:公司处理员⼯请假请求
Handler:
public abstract class Handler {  private Handler nextHandler;  //当前领导能审批通过的最多天数 public int maxDay;  protected Handler(int maxDay){ this.maxDay = ProjectManager:
public class ProjectManager extends Handler{ public ProjectManager(int maxDay) { super(maxDay); } @Override protected void reply(int day) { System.ou
springboot架构图案例⼆:销售团队处理客户需求
销售团队的层级关系:
Sales:<=5%Manager:<=30%Director:<=40%Vice President:<=50%CEO:<=55%
PriceHandler:
/** * 价格处理⼈:负责处理客户的折扣申请 * 使⽤抽象类作为Handler的载体, * 因为Handler需要有⼀个指向⾃⾝类型的引⽤,使⽤interface不⽅便 * @author HCX *
Sales:
/** * 销售⼈员,可以批准5%以内的折扣 * @author HCX * */public class Sales extends PriceHandler { @Override public void processDiscount(float discount) { if(dis Manager:
/** * 销售经理,可以批准30%以内的折扣 * @author HCX * */public class Manager extends PriceHandler{ @Override public void processDiscount(float discount) { if Director:
/** * 销售总监,可以批准40%以内的折扣 * @author HCX * */public class Director extends PriceHandler { @Override public void processDiscount(float discount) { if VicePresident:
/** * 销售副总裁,可以批准50%以内的折扣 * @author HCX * */public class VicePresident extends PriceHandler { @Override public void processDiscount(float disco CEO:
/** * CEO,可以批准55%以内的折扣 * 折扣超出55%,拒绝申请 * @author HCX * */public class CEO extends PriceHandler{ @Override public void processDiscount Customer:
/** * 客户,请求折扣 * @author HCX * */public class Customer {  private PriceHandler priceHandler;  public void setPriceHandler(PriceHandler priceHandler) { this.
修改:在Sales和manager之间加⼊Lead层级:
加⼊了新的类Lead,并对⼯⼚⽅法进⾏了改动
Lead:
/** * 销售⼩组长,可以批准15%以内的折扣 * @author HCX * */public class Lead extends PriceHandler{ @Override public void processDiscount(float discount) { if(d PriceHandler:
/** * 价格处理⼈:负责处理客户的折扣申请 * 使⽤抽象类作为Handler的载体, * 因为Handler需要有⼀个指向⾃⾝类型的引⽤,使⽤interface不⽅便 * @author HCX *
改进:OO之中的原则:单⼀职责原则,在设计⼀个接⼝时,应该只将与该接⼝业务相关的⽅法放在接⼝之中,这样才能使设计更加健壮⽽
不⾄于当变化发⽣时,需要修改多处。
PriceHandler:提供了处理业务的⽅法,也提供了创建PriceHandler实例的⼯⼚⽅法。这两种⽅法在功能上不能类聚的,两者之间没有关
系,该设计不符合单⼀职责原则。
把⼯⼚⽅法抽取出来:
PriceHandlerFactory:
public class PriceHandlerFactory { /** * 创建PriceHandler的⼯⼚⽅法 * @return */ public static PriceHandler createPriceHandler() { PriceHandler sales = new Sales
Customer:
/** * 客户,请求折扣 * @author HCX * */public class Customer {  private PriceHandler priceHandler;  public void setPriceHandler(PriceHandler priceHandler) { this. PriceHandler:
/** * 价格处理⼈:负责处理客户的折扣申请 * 使⽤抽象类作为Handler的载体, * 因为Handler需要有⼀个指向⾃⾝类型的引⽤,使⽤interface不⽅便 * @author HCX *实际中的应⽤
①try-catch语句:
每⼀个catch语句是根据Exception异常类型进⾏匹配的,⼀般会有多个catch语句,就形成了⼀个责任链;此时如果有⼀个catch语句与当
前所要处理的异常Exception符合时,该Exception就会交给相应的catch语句进⾏处理,之后的catch语句就不会再执⾏了。
②异常处理机制:
⽅法的调⽤构成了⼀个栈,当栈顶的⽅法产⽣异常时,需要将异常抛出,被抛出的异常沿着调⽤栈向下发展,寻⼀个处理的块,被栈顶抛
出的⽅法作为⼀个请求,⽽调⽤栈上的每⼀个⽅法就相当于⼀个handler,该Handler即可以选择⾃⾏处理这个被抛出的异常,也可以选择
将异常沿着调⽤栈传递下去。
异常:请求
调⽤栈中的每⼀级:Handler
调⽤栈中的handler:责任链
栈底元素:上⼀级元素的直接后继
③过滤器链(⼀般链条中只有⼀个对象处理请求,但是过滤器链可以有多个对象同时处理请求)
④Spring Security框架
通过多个filter类构成⼀个链条来处理Http请求,从⽽为应⽤提供⼀个认证与授权的框架。
责任链模式内部处理
在责任链模式中,作为请求接受者的多个对象通过对其后继的引⽤⽽连接起来形成⼀条链。请求在这条链上传递,直到链上某⼀个接收者处
理这个请求。每个接收者都可以选择⾃⾏处理请求或是向后继传递请求
Handler设了⼀个⾃⾝类型的对象作为其后继,Handler是抽象的,从⽽整条链也是抽象的,这种抽象的特性使得在运⾏时可以动态的绑定
链条中的对象,从⽽提供了⾜够的空间。
在代码中直接后继successor的类型是PriceHandler,⽽不是任何其他具体的类(Sales、Manager等),使得在后⾯变更需求时,加⼊了
lead层次,可以简单的实现。所以责任链模式遵循了依赖注⼊原则,即依赖于抽象⽽⾮依赖于实现。降低了程序的耦合度。
发出请求的客户端并不知道链上的哪⼀个接收者会处理这个请求,从⽽实现了客户端和接收者之间的分离。
责任链模式的优缺点
开闭原则:对扩展开放,对变更关闭;
有业务变更时,希望通过新增⼀个类,⽽⾮修改原有的代码来满⾜业务需求。
在案例⼆中,通过新增了⼀个lead类,但同时也修改了⼯⼚⽅法createPriceHandler。
⽽实际的好坏还是取决于实际的项⽬需求。因此对经典原则的取舍需要根据实际项⽬情况决定。
执⾏性能:在结构上,责任链模式由处理器⾸尾相接构成的⼀条链,当由请求到来之时,需要从链的头部开始遍历整条责任链,直到有
⼀个处理器处理了请求,或者是整个链条遍历完成。在这个过程中性能的损耗体现在两个⽅⾯:
时间:相对于单个handler处理请求的时间⽽⾔,整个链条遍历的过程可能会消耗更多的时间。
内存:创建了⼤量的对象来表⽰处理器对象,但是实际仅仅使⽤了其中的少部分,剩余的⼤部分处理器都未被使⽤到。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。