设计模式-------责任链模式

    责任链模式:客户端在一个”链条“中处理业务逻辑。

业务场景就是:客户买东西申请折扣,

  普通销售员: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;
    }
}
View Code
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;
    }
}
View Code

测试:首先构建责任链。然后直接调用链头的方法

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请求中,我们设置的拦截器就是责任链模式的基本应用。

优缺点:

  优点:屏蔽接口内部调用,对外只提供一个接口。

  缺点:如果链的节点过于长,那么请求的处理过程性能就会变慢。这就是在日常开发中没事别乱添加拦截器。

 

posted @ 2016-08-03 14:42  钟政123  阅读(220)  评论(0编辑  收藏  举报