责任链设计模式

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

下面就是现实中使用的一个场景,一个公司的员工,需要进行请假,会经过以下几种情况,请假天数小于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(你不知道一样东西,你也会不知道自己不知道这样东西)
原文地址:https://www.cnblogs.com/2014-1130/p/14388346.html