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

对于一个业务的处理,当前的处理者要么处理完毕做出回应,要么把请求转发到后序环节处理(最后的都没处理不了,就不处理了呗)。这些处理者组成一个处理的链表,就是责任链模式。
示例:
有一个订单打折的审批流程,销售人员最多能打折97% 为1级,销售主管打折不能大于95% 为2级,打折大于95%要经理审批为3级。如果不使用责任链模式,那么就会有如下代码:
    public static void main(String[] args) {
        int level=1;
        if( level == 1 ){
            //销售员审批
        }else if( level == 2 ){
            //销售经理审批
        }else if( level == 3 ){
            //老板审批
        }else{
            //审批不过
        }
    }

代码中充满了if...else,还不美观。

责任链代码实现:

public class Test {

    /**
     * 处理类
     * 有三个级别,分别对应 销售,经理,老板
     */
    static abstract class Handler{

        //下一个处理者
        private Handler nextHandler;
        //当前的级别
        private int level;
        public Handler() {}
        public Handler(int level) {
            this.level = level;
        }

        public void setLevel(int level) {
            this.level = level;
        }
        public void setNextHandler(Handler nextHandler) {
            this.nextHandler = nextHandler;
        }

        //处理模板
        public void handler(Order order){
            if(order.getLevel() == this.level){
                this.approve();
            }else{
                if(this.nextHandler!=null){
                    nextHandler.handler(order);
                }else{
                    System.out.println("----不同意----");
                }
            }
        }
        //真正的处理,留给子类处理
        public abstract void approve();
    }

    static class SellerHandler extends Handler{
        public SellerHandler() {
            super(1);
        }
        @Override
        public void approve() {
            System.out.println("---销售审批---");
        }
    }

    static class ManagerHandler extends Handler{
        public ManagerHandler() {
            super(2);
        }

        @Override
        public void approve() {
            System.out.println("---经理审批---");
        }
    }

    static class BossHandler extends Handler{
        public BossHandler() {
            super(3);
        }

        @Override
        public void approve() {
            System.out.println("---老板审批---");
        }
    }

    /**
     * 订单业务
     */
    static class Order{
        private int level;
        public int getLevel() {
            return level;
        }
        public Order(int level) {
            this.level = level;
        }
    }

    public static void main(String[] args) {

        //订单等级
        Order order = new Order(4);

        //审批对象
        SellerHandler sellerHandler = new SellerHandler();
        ManagerHandler managerHandler = new ManagerHandler();
        BossHandler bossHandler = new BossHandler();

        //责任链
        sellerHandler.setNextHandler(managerHandler);
        managerHandler.setNextHandler(bossHandler);


        sellerHandler.handler(order);

    }
    
}

说明:

 1、处理类 Handler  ,有级别 level 属性,标识当前handler 能够处理的级别;Handler nextHandler 属性标识下一个处理的handler。还有一个模板方法handler 定义了审批的流程;approve 方法是审批方法是子类实现的,不同的处理者审批实现不同。
 2、接下来就是销售人员,销售经理,老板的审批实现。
 3、在测试时,要设置handler 的下一个处理者是谁,当前处理者不能处理的业务级别就流转到下一个处理者处理

类图:


enum 实现:

 责任链主要的是定义了处理者的链条,enum定义完了,就是自带顺序的,所有enum 定义完了就是一个责任链。

代码:

public class Test2 {


    interface Handler{
        boolean approve(int level);
    }

    enum  HandlerEnum implements Handler{
        Seller{
            int level=1;
            @Override
            public boolean approve(int level) {
                if(level==this.level){
                    System.out.println("Seller approve");
                    return true;
                }
                return false;
            }
        },
        Manager{
            int level=2;
            @Override
            public boolean approve(int level) {
                if(level==this.level){
                    System.out.println("Manager approve");
                    return true;
                }
                return false;
            }
        },
        Boss{
            int level=3;
            @Override
            public boolean approve(int level) {
                if(level==this.level){
                    System.out.println("Boss approve");
                    return true;
                }
                return false;
            }
        };

        /**
         * 审批
         * enum 默认是有序的,在遍历是就是声明enum的顺序
         * @param order
         * @return
         */
        public static boolean approve(Order order){
            for (HandlerEnum handlerEnum : HandlerEnum.values()) {
                if(handlerEnum.approve(order.level)){
                    return true;
                }
            }
            return false;
        }
    }

    /**
     * 订单业务
     */
    static class Order{
        private int level;
        public int getLevel() {
            return level;
        }
        public Order(int level) {
            this.level = level;
        }
    }

    public static void main(String[] args) {
        Order order = new Order(3);
        boolean approve = HandlerEnum.approve(order);
        System.out.println(approve==true?"审核通过":"审核不通过");
    }


优点:
无法预知来自外界折扣是属于哪种类型,每个类如果碰到它不能处理的折扣信息只要放弃就可以。
缺点:
扩展性差,一定要有一个统一的接口。
缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值