m0_61861429 2023-02-18 22:24 采纳率: 50%
浏览 24
已结题

如何使用职责链模式设计

某企业的SCM(Supply Chain Management,供应链管理)系统中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。如何使用职责链模式设计并实现该系统。

  • 写回答

1条回答 默认 最新

  • 梦想橡皮擦 Python领域优质创作者 2023-02-18 22:58
    关注

    方案来自 梦想橡皮擦 狂飙组基于 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);
            }
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月2日
  • 已采纳回答 2月22日
  • 创建了问题 2月18日

悬赏问题

  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图