每个公司可能都存在自己的采购审批模式,那么如何在软件中设计这样一个采购单的分级审批?
假如 Sunny 软件公司开发人员提出了一个初始解决方法,在系统中 提供一个采购单处理类 PurchaseRequestHandler
用于才统一处理采购单,代码如下:
// 采购单处理类
class PurchaseRequestHandler {
// 递交采购单给主任
public void sendRequestToDirector(PurchaseRequest request) {
if (request.getAmount() < 50000) {
// 主任可以审批该采购单
this.handleByDirector(request);
}
else if (request.getAmount() < 100000) {
// 副董事长可审批
this.handleByVicePresident(request);
}
else if (request.getAmount() < 500000) {
// 董事长可审批
this.handleByPresident(request);
}
else {
// 董事会可审批
this.handleByCongress(request);
}
}
// 主任审批采购单
public void handleByDirector(PurchaseRequest request) {
// 代码省略
}
public void handleByVicePresident(PurchaseRequest request) {
// to do
}
public void handleByPresident(PurchaseRequest request) {
// to do
}
public void handleByCongress(PurchaseRequest request) {
// to do
}
通过上面的代码很容易就能实现流程审批,但仔细发现, 会有 3 个问题:
PurchaseRequestHandle
类较为庞大,各个级别的审批方法都集中在一个类中,违反了单一职责原则,测试和维护难度大。针对这 3 个缺点,可以通过责任链模式解决。
责任链模式,又被称为职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility。
责任链模式是一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。
责任链模式为请求创建了一个处理对象的链。避免将请求发送者与接收者耦合在一起,让多个对象都有机会接收请求,连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
发起请求和具体处理请求的过程进行解耦:责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递。
通常情况下, 该类中定义了一个保存对于下个处理者引用的成员变量。 客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。 该类还可以实现默认的处理行为: 确定下个处理者存在后再将请求传递给它。
处理者通常是独立且不可变的, 需要通过构造函数一次性地获得所有必要地数据。
抽象处理者的典型代码如下:
abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(String request);
}
上述代码中,抽象处理者类定义了对下家的引用对象,以便将请求转发给下家,该对象的访问符可设为 protected,在其子类中可以使用。在抽象处理类中声明抽象的请求处理方法,具体实现交给子类完成。
具体处理者的两个作用:
handleRequest()
代码如下:
class ConcreteHandler extends Handler {
public void handleRequest(String request) {
if (请求满足条件) {
// 处理请求
}
else {
this.successor.handleRequest(request); // 转发请求
}
}
}
参考链接:
领取专属 10元无门槛券
私享最新 技术干货