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