1、需求
学校OA系统的采购审批项目:需求是
采购员采购教学器材
如果金额小于等于5000,由教学主任审批
如果金额小于等于10000,由院长审批
如果金额小于等于30000,由副校长审批
如果金额超过30000以上,有校长审批
2、方案一
最容易想到的,将需求转变成if else。导致代码强耦合,需要知道不同人审批的金额界限,并且如果审批金额界限发生变化,相关代码也要改变。
if (price <= 5000) {
教学主任审批
} else if (price <= 10000) {
院长审批
} else if (price <= 30000) {
副校长审批
} else {
校长审批
}
3、方案二:责任链
责任链模式:为请求创建了一个处理者对象的链。每个处理者都包含对另一个处理者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个处理者,依此类推。
- 客户端:创建处理链,从责任链的第一个处理者开始处理请求
- 抽象处理者:包含下一个处理者、处理请求的方法
- 具体处理者:实现抽象处理者的处理请求方法,判断能否处理本次请求,如果可以则处理请求,否则将该请求转给它的后继者
代码实现:重在思路
- 创建请求
@Data
public class MyRequest {
private int price;
public MyRequest(int price) {
this.price = price;
}
}
- 创建抽象处理者
public abstract class Handler {
// 必须:下一个处理者
Handler nextHandler;
public void setNext(Handler nextHandler) {
this.nextHandler = nextHandler;
}
// 必须:处理请求的方法
public abstract void handleRequest(MyRequest request);
// 可选
String handlerName;
public Handler(String name) {
this.handlerName = name;
}
}
- 创建具体处理者
public class 教学主任 extends Handler {
// 必须:实现抽象处理者的处理请求方法
@Override
public void handleRequest(MyRequest request) {
if(request.getPrice() <= 5000) {
System.out.println("被"+this.name+"处理");
}
//如果不满足条件,则丢给下一个处理者
else {
System.out.println("不能被"+this.name+"处理");
nextHandler.handleRequest(request);
}
}
// 可选
public 教学主任(String name) {
super(name);
}
}
public class 院长 extends Handler {
// 必须:实现抽象处理者的处理请求方法
@Override
public void handleRequest(MyRequest request) {
// 判断能否处理本次请求,如果可以则处理请求
if (request.getPrice() <= 5000) {
System.out.println("被"+this.name+"处理");
}
// 否则丢给下一个处理者
else {
System.out.println("不能被"+this.name+"处理");
nextHandler.handleRequest(request);
}
}
// 可选
public 院长(String name) {
super(name);
}
}
public class 副校长 extends Handler {}
public class 校长 extends Handler {}
- 客户端
public class Client {
public static void main(String[] args) {
// 1、创建请求
MyRequest request = new MyRequest(28000);
// 2、创建所有需要的处理者
教学主任 教学主任1 = new 教学主任("张教学主任");
院长 院长2 = new 院长("王院长");
副校长 副校长3 = new 副校长("孙副校长");
校长 校长4 = new 校长("李校长");
// 3、形成责任链
教学主任1.setNext(院长2);
院长2.setNext(副校长3);
副校长3.setNext(校长4);
// 4、从责任链的第一个处理者开始处理请求
教学主任1.handleRequest(request);
}
}