责任链模式:客户端在一个”链条“中处理业务逻辑。
业务场景就是:客户买东西申请折扣,
普通销售员:5%
经理:15%
CEO:30%和拒接大于30%的折扣
一个客户来到商店买东西,想要优惠价。他首先向普通销售询问折扣,如果普通销售员不能做主,他将向上级传递。客户并不知道是谁处理了折扣的申请。
责任链:有两个元素。1)处理业务逻辑,2)下一个链节的对象
我们来定义一个接口
package duty; /** * @author ZHONGZHENG664 * @date 2018/11/29. */ public interface Duty { int doSomething(int n ); void setNext(Duty next); }
接口的两种实现:单纯针对5和15做平方而已
package duty; /** * @author ZHONGZHENG664 * @date 2018/11/29. */ public class DutyImp implements Duty{ private Duty next; public int doSomething(int n) { if(n==5){ return n*5; } if(next!=null){ return next.doSomething(n); } return 0; } public void setNext(Duty next) { this.next = next; } }
package duty; /** * @author ZHONGZHENG664 * @date 2018/11/29. */ public class Manager implements Duty { private Duty next; public int doSomething(int n) { if(n==15){ return n*15; } if(next!=null){ return next.doSomething(n); } return 0; } public void setNext(Duty next) { this.next = next; } }
测试:首先构建责任链。然后直接调用链头的方法
package duty; /** * @author ZHONGZHENG664 * @date 2018/11/29. */ public class DutyTest { public static void main(String[] agrs){ Duty manager=new Manager(); Duty salce=new DutyImp(); salce.setNext(manager); System.out.println(salce.doSomething(5)); System.out.println(salce.doSomething(15)); System.out.println(salce.doSomething(10)); } }
返回结果:
25 225 0
单纯的访问链头。可以根据链路调用对应的方法。比单纯的if else结构代码封装更好一点。
责任链的实际应用:
在WEB请求中,我们设置的拦截器就是责任链模式的基本应用。
优缺点:
优点:屏蔽接口内部调用,对外只提供一个接口。
缺点:如果链的节点过于长,那么请求的处理过程性能就会变慢。这就是在日常开发中没事别乱添加拦截器。