zoukankan      html  css  js  c++  java
  • 责任链设计模式

      责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送,在收到请求后,每个处理这均可对请求进行处理,或将其传奇给链上的下个处理者

    下面就是现实中使用的一个场景,一个公司的员工,需要进行请假,会经过以下几种情况,请假天数小于4天,主管审批,请假天数大于3天小于8天项目经理审批,请假天数大于7天,公司总经理审批

    1.有四个角色,职员,主管,项目经理,总经理
    2.动作:职员请假,主管,项目经理,总经理审批,这个是已有场景中可以获取到的信息,但是还缺少一个信息,就是请假的信息,这个对象需要怎么构建

    • 首先我们会定义角色对象,GeneralManager,ProjectManager,Supervisor,Employee,再定义对象之间信息传输的过程信息对象ProcessInfo,这个对象中,有审批结果信息,审批天数,审批评论,审批角色(谁审批),对于审批结果我们可以定一个StatusConstants,常量池,方便对象的审批状态获取,应该是各个角色都赋予的功能,动作的发起对象,动作的审批对象,过程的信息模型我们也创建好,那接下来,来写核心处理器,因为我们会对行为和属性进行抽象,所以使用抽象类比接口更为合适,还有抽象类更适合实现流程话的方式

      在抽象类中,我们会创建两个方法,一个是各个角色都要实现各自功能的方法的approve,还有一个是各个角色approve后的,统一处理方法afterApprove,比如通知职员审批结果等操作

      下面是实现代码,代码总共分为三部分,发起,执行动作,执行动作后

    private static void callDesign(){
                Employee employee = new Employee();
                Integer wDay = employee.submit();
        
                ProcessInfo processInfo = new ProcessInfo();
                processInfo.setDay(wDay);
        
                Supervisor supervisor = new Supervisor();
                supervisor.approve(processInfo);
            }
    
    
     public void approve(ProcessInfo processInfo) {
            processInfo.setResult(StatusConstants.approve_rs_agree);
            processInfo.setRole(role_name);
            super.afterApprove(processInfo);
            //可以加入外部动作...
            super.handler(new ProjectManager(), processInfo);
        }
    
    public abstract void approve(ProcessInfo processInfo);
    
        public void afterApprove(ProcessInfo p){
            if (StatusConstants.approve_rs_agree.equals(p.getResult())){
                System.out.println(p.getRole() + " " +StatusConstants.approve_rs_agree);
            } else {
                System.out.println(p.getRole() + " " +StatusConstants.approve_rs_reject);
                System.out.println(p.getRole() + " " +p.getComment());
            }
        }
    • 这种情况,如果没有设计模式的实现,会发现代码很大冗余,不好改动,实现比较简单
    private static void callNoDesign(){
            Employee employee = new Employee();
            Integer wDay = employee.submit();
            if (wDay < 4) {
                Supervisor supervisor = new Supervisor();
                supervisor.approve();
            } else if (wDay < 8){
                Supervisor supervisor = new Supervisor();
                supervisor.approve();
                ProjectManager projectManager = new ProjectManager();
                projectManager.approve();
            } else {
                Supervisor supervisor = new Supervisor();
                supervisor.approve();
                ProjectManager projectManager = new ProjectManager();
                projectManager.approve();
                GeneralManager generalManager = new GeneralManager();
                generalManager.approve();
            }
        }
    Unkonw Unkonw(你不知道一样东西,你也会不知道自己不知道这样东西)
  • 相关阅读:
    容器类总结
    CopyOnWriteArrayList
    ConcurrentHashMap
    nginx 反向代理,支持跨域,前后分离
    H5新特性 input type=date 在手机上默认提示显示无效解决办法
    浅析angular,react,vue.js jQuery使用区别
    Vue 微前端&微服务解决方案,远程组件服务化
    webspack 系统学习笔记
    2019年NodeJS框架Koa和Express选型对比
    转载:微前端的技术选型和对比
  • 原文地址:https://www.cnblogs.com/2014-1130/p/14388346.html
Copyright © 2011-2022 走看看