职责链模式-Chain of Responsibility Pattern

  • 某个业务因为属性,只能被某个chain来处理
  • 如果用if else来判断,代码不够好看
1. 采购价格在5以下,第一个人可以审批
2. 5-10, 第二个人
3. 10-50, 第三个人
package com.nike.erick.chain;


/*审批流程:  1,采购价格在5以下,第一个人可以审批
 *          2. 5-10, 第二个人
 *          3. 10-50, 第三个人
 */

public class Executor {
    private static FirstFilter firstFilter;
    private static SecondFiler secondFilter;
    private static ThirdFilter thirdFilter;

    static {
        firstFilter = new FirstFilter("First Filter");
        secondFilter = new SecondFiler("Second Filter");
        thirdFilter = new ThirdFilter("Third Filter");

        firstFilter.setNextFilter(secondFilter);
        secondFilter.setNextFilter(thirdFilter);
        thirdFilter.setNextFilter(firstFilter);
    }


    public static boolean execute(Request request) {
        /*可以用任意一个处理器来处理*/
        if (request.price <= 0 || request.price > 50) {
            throw new IllegalArgumentException("Illegal Price");
        }
        secondFilter.process(request);
        return request.isDone;
    }
}

abstract class Filter {

    /*包含一个具体处理的实现类*/
    public Filter nextFilter;

    /*子类来调用的构造方法*/
    public String name;

    public Filter(String name) {
        this.name = name;
    }

    public void setNextFilter(Filter filter) {
        this.nextFilter = filter;
    }

    /*具体来处理,是由子类完成*/
    public abstract void process(Request request);
}

/*静态内部类,保证外面无法看见具体的实现*/
class FirstFilter extends Filter {

    /*构造器的具体的名字*/
    public FirstFilter(String name) {
        super(name);
    }

    @Override
    public void process(Request request) {
        if (request.price <= 5) {
            request.isDone = true;
            System.out.println(this.getClass().getSimpleName() + "Done Job");
        } else {
            /*交给下一级处理*/
            nextFilter.process(request);
        }
    }
}

class SecondFiler extends Filter {
    public SecondFiler(String name) {
        super(name);
    }

    @Override
    public void process(Request request) {
        if (request.price > 5 && request.price <= 10) {
            request.isDone = true;
            System.out.println(this.getClass().getSimpleName() + "Done Job");
        } else {
            nextFilter.process(request);
        }
    }
}

class ThirdFilter extends Filter {
    public ThirdFilter(String name) {
        super(name);
    }

    public void process(Request request) {
        if (request.price > 10 && request.price <= 50) {
            request.isDone = true;
            System.out.println(this.getClass().getSimpleName() + "Done Job");
        } else {
            nextFilter.process(request);
        }
    }
}

class Request {
    public int price;
    public boolean isDone;
}
package com.nike.erick.chain;

public class Demo01 {
    public static void main(String[] args) {
        Request request = new Request();
        request.setDone(false);
        request.setPrice(10);

        boolean isDone = Executor.execute(request);
        System.out.println("JOB DONE: " + isDone);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值