如何使用职责链模式设计

某企业的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);
        }
    }
}