请求的链式处理——职责链模式(三)

    在图16-3中,抽象类Approver充当抽象处理者(抽象传递者),Director、VicePresident、President和Congress充当具体处理者(具体传递者),PurchaseRequest充当请求类。完整代码如下所示:

    编写如下客户端测试代码:

    1. public static void main(String[] args) {
    2. Approver wjzhang,gyang,jguo,meeting;
    3. wjzhang = new Director("张无忌");
    4. gyang = new VicePresident("杨过");
    5. jguo = new President("郭靖");
    6. meeting = new Congress("董事会");
    7. //创建职责链
    8. wjzhang.setSuccessor(gyang);
    9. gyang.setSuccessor(jguo);
    10. jguo.setSuccessor(meeting);
    11. //创建采购单
    12. wjzhang.processRequest(pr1);
    13. PurchaseRequest pr2 = new PurchaseRequest(60000,10002,"购买《葵花宝典》");
    14. wjzhang.processRequest(pr2);
    15. PurchaseRequest pr3 = new PurchaseRequest(160000,10003,"购买《金刚经》");
    16. wjzhang.processRequest(pr3);
    17. PurchaseRequest pr4 = new PurchaseRequest(800000,10004,"购买桃花岛");
    18. wjzhang.processRequest(pr4);
    19. }
    20. }

    如果需要在系统增加一个新的具体处理者,如增加一个经理(Manager)角色可以审批5万元至8万元(不包括8万元)的采购单,需要编写一个新的具体处理者类Manager,作为抽象处理者类Approver的子类,实现在Approver类中定义的抽象处理方法,如果采购金额大于等于8万元,则将请求转发给下家,代码如下所示:

    1. //经理类:具体处理者
    2. super(name);
    3. }
    4. //具体请求处理方法
    5. public void processRequest(PurchaseRequest request) {
    6. if (request.getAmount() < 80000) {
    7. System.out.println("经理" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getPurpose() + "。"); //处理请求
    8. }
    9. else {
    10. this.successor.processRequest(request); //转发请求
    11. }
    12. }

    由于链的创建过程由客户端负责,因此增加新的具体处理者类对原有类库无任何影响,无须修改已有类的源代码,符合“开闭原则”。

    在客户端代码中,如果要将新的具体请求处理者应用在系统中,需要创建新的具体处理者对象,然后将该对象加入职责链中。如在客户端测试代码中增加如下代码:

    1. //创建职责链

    wjzhang.setSuccessor(rhuang); //将“黄蓉”作为“张无忌”的下家
    rhuang.setSuccessor(gyang); //将“杨过”作为“黄蓉”的下家
    gyang.setSuccessor(jguo);
    jguo.setSuccessor(meeting);

    主任张无忌审批采购单:10001,金额:45000.0元,采购目的:购买倚天剑。 经理黄蓉审批采购单:10002,金额:60000.0元,采购目的:购买《葵花宝典》。 董事长郭靖审批采购单:10003,金额:160000.0元,采购目的:购买《金刚经》。 召开董事会审批采购单:10004,金额:800000.0元,采购目的:购买桃花岛。 ```

    思考