某企业的SCM(Supply Chain Management,供应链管理)系统中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。如何使用职责链模式设计并实现该系统。
方案来自 梦想橡皮擦 狂飙组基于 GPT 编写的 “程秘”
在该企业的SCM系统中,采购审批子系统是一个典型的职责链场景,可以使用职责链模式进行设计和实现。
首先,定义一个采购审批处理器抽象类,其中包含审批处理器的共同行为,例如审批处理器的名称、处理请求的方法等。代码如下:
abstract class PurchaseHandler {
private String name; // 审批处理器的名称
private PurchaseHandler successor; // 下一个处理器
public PurchaseHandler(String name) {
this.name = name;
}
public void setSuccessor(PurchaseHandler successor) {
this.successor = successor;
}
// 处理请求的方法
public abstract void handleRequest(PurchaseRequest request);
// 获取处理器名称的方法
public String getName() {
return name;
}
}
接下来,定义具体的采购审批处理器类,分别对应不同层次的主管人员。对于每个处理器类,重写handleRequest方法,如果采购单金额小于当前处理器能够审批的金额上限,则进行审批操作;否则,将采购单转发给下一个处理器进行处理。代码如下:
class Director extends PurchaseHandler {
private final double LIMIT = 50000.0; // 主任能够审批的金额上限
public Director(String name) {
super(name);
}
@Override
public void handleRequest(PurchaseRequest request) {
if (request.getAmount() < LIMIT) {
System.out.println(getName() + "审批采购单:" + request);
} else {
successor.handleRequest(request);
}
}
}
class VicePresident extends PurchaseHandler {
private final double LIMIT = 100000.0; // 副董事长能够审批的金额上限
public VicePresident(String name) {
super(name);
}
@Override
public void handleRequest(PurchaseRequest request) {
if (request.getAmount() >= LIMIT && request.getAmount() < 500000.0) {
System.out.println(getName() + "审批采购单:" + request);
} else {
successor.handleRequest(request);
}
}
}
class President extends PurchaseHandler {
private final double LIMIT = 500000.0; // 董事长能够审批的金额上限
public President(String name) {
super(name);
}
@Override
public void handleRequest(PurchaseRequest request) {
if (request.getAmount() >= LIMIT && request.getAmount() < 1000000.0) {
System.out.println(getName() + "审批采购单:" + request);
} else {
successor.handleRequest(request);
}
}
}
class BoardOfDirectors extends PurchaseHandler {
public BoardOfDirectors(String name) {
super(name);
}
@Override
public void handleRequest(PurchaseRequest request) {
if (request.getAmount() >= 1000000.0) {
System.out.println(getName() + "审批采购单:" + request);
} else {
System.out.println("无法处理采购单:" + request);
}
}
}