java-责任链模式案例

题目:

Sunny软件公司承接了某企业SCM(Supply ChainManagement,供应链管理)系统的开发任务,其中包含一个采购审批子系统。该企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开董事会讨论决定。如图16-1所示:

 

类图:

 

 

代码:

1.PurchaseRequest.java  (采购单)

package ChainOfResponsibility;

class PurchaseRequest {  
    private double amount;  //采购金额  
    private int number;  //采购单编号  
    private String purpose;  //采购目的  
      
    public PurchaseRequest(double amount, int number, String purpose) {  
        this.amount = amount;  
        this.number = number;  
        this.purpose = purpose;  
    }
    public void setAmount(double amount) {  
        this.amount = amount;  
    }  
      
    public double getAmount() {  
        return this.amount;  
    }  
      
    public void setNumber(int number) {  
        this.number = number;  
    }  
      
    public int getNumber() {  
        return this.number;  
    }  
      
    public void setPurpose(String purpose) {  
        this.purpose = purpose;  
    }  
      
    public String getPurpose() {  
        return this.purpose;  
    }  
}
    

public class StepOne {

}

 

2. PurchaseRequestHandle.java
 

package ChainOfResponsibility;

//审批者类:抽象处理者  
abstract class Approver {  
  protected Approver successor; //定义后继对象  
  protected String name; //审批者姓名  
    
  public Approver(String name) {  
      this.name = name;  
  }  

  //设置后继者  
  public void setSuccessor(Approver successor) {   
      this.successor = successor;  
  }  

  //抽象请求处理方法  
  public abstract void processRequest(PurchaseRequest request);  
}  

//主任类:具体处理者  
class Director extends Approver {  
  public Director(String name) {  
      super(name);  
  }  
    
  //具体请求处理方法  
  public void processRequest(PurchaseRequest request) {  
      if (request.getAmount() < 50000) {  
          System.out.println("主任" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getPurpose() + "。");  //处理请求  
      }  
      else {  
          this.successor.processRequest(request);  //转发请求  
      }     
  }  
}  

//副董事长类:具体处理者  
class VicePresident extends Approver {  
  public VicePresident(String name) {  
      super(name);  
  }  
    
  //具体请求处理方法  
  public void processRequest(PurchaseRequest request) {  
      if (request.getAmount() < 100000) {  
          System.out.println("副董事长" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getPurpose() + "。");  //处理请求  
      }  
      else {  
          this.successor.processRequest(request);  //转发请求  
      }     
  }  
}  

//董事长类:具体处理者  
class President extends Approver {  
  public President(String name) {  
      super(name);  
  }  
    
  //具体请求处理方法  
  public void processRequest(PurchaseRequest request) {  
      if (request.getAmount() < 500000) {  
          System.out.println("董事长" + this.name + "审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getPurpose() + "。");  //处理请求  
      }  
      else {  
          this.successor.processRequest(request);  //转发请求  
      }  
  }  
}  

//董事会类:具体处理者  
class Congress extends Approver {  
  public Congress(String name) {  
      super(name);  
  }  
    
  //具体请求处理方法  
  public void processRequest(PurchaseRequest request) {  
      System.out.println("召开董事会审批采购单:" + request.getNumber() + ",金额:" + request.getAmount() + "元,采购目的:" + request.getPurpose() + "。");        //处理请求  
  }      
}  

public class PurchaseRequestHandle {
     public static void main(String[] args) {  
            Approver wjzhang,gyang,jguo,meeting;  
            wjzhang = new Director("张无忌");  
            gyang = new VicePresident("杨过");  
            jguo = new President("郭靖");  
            meeting = new Congress("董事会");  
            
               
            wjzhang.setSuccessor(gyang); //将“杨过”作为“张无忌”的下家  
            gyang.setSuccessor(jguo);  
            jguo.setSuccessor(meeting);  
              
            //创建采购单  
            PurchaseRequest pr1 = new PurchaseRequest(45000,10001,"购买倚天剑");  
            wjzhang.processRequest(pr1);  
              
            PurchaseRequest pr2 = new PurchaseRequest(60000,10002,"购买《葵花宝典》");  
            wjzhang.processRequest(pr2);  
          
            PurchaseRequest pr3 = new PurchaseRequest(160000,10003,"购买《金刚经》");  
            wjzhang.processRequest(pr3);  
      
            PurchaseRequest pr4 = new PurchaseRequest(800000,10004,"购买桃花岛");  
            wjzhang.processRequest(pr4);  
        }  
}



结果:

 

<think>好的,我需要帮助用户找到Java责任链模式的示例代码。根据用户提供的引用内容,有几个相关的资源提到了责任链模式的实现和应用。首先,引用[1]、[2]、[3]和[4]都讨论了责任链模式的基本概念和适用场景,尤其是引用[3]提到了Spring Security中的过滤器链作为例子,而引用[5]提到了多用户环境下的审核流程应用。 用户需要的是具体的示例代码。根据引用[1]和[2],责任链模式通常涉及处理器的抽象类或接口,以及具体的处理器实现类,每个处理器持有下一个处理器的引用。可能的步骤包括: 1. 定义一个处理器接口,包含处理请求的方法和设置下一个处理器的方法。 2. 创建具体处理器类,每个类实现处理逻辑,并决定是否将请求传递给下一个处理器。 3. 客户端代码构建责任链,并将请求发送给链的第一个处理器。 需要确保代码符合Java标准,并且能够展示责任链的动态传递特性。例如,审核流程的例子中,每个审核环节作为处理器,依次处理请求,直到某个环节处理完毕或到达链的末端。 还要注意引用提到的性能问题(引用[4]),避免过长的责任链影响性能,并确保每个请求都被处理。因此示例应简洁,展示基本结构即可。 接下来,结合这些信息,构建一个审核流程的示例代码,包括抽象处理器、具体处理器(如部门经理、人事总监、总经理),以及客户端如何组装链条并触发处理。同时,需要解释各个部分的作用,符合用户要求的清晰结构。 需要验证代码是否正确,比如每个处理器是否设置下一个处理器,处理逻辑是否正确传递请求。此外,确保使用中文注释和解释,符合用户的语言要求。 最后,生成相关问题,可能涉及责任链模式的优缺点、实际应用场景、与其它模式的区别等,参考用户提供的示例问题结构。</think>### Java责任链模式示例代码及讲解 责任链模式的核心思想是将多个处理器对象连接成链,请求沿着链传递直到被处理。以下是基于审核流程的完整示例: #### 1. 定义请求对象 ```java public class Request { private String content; // 请求内容 private boolean approved; // 审批状态 // 构造函数、getter/setter省略 } ``` #### 2. 创建处理器接口 ```java public interface Approver { void setNextApprover(Approver nextApprover); void processRequest(Request request); } ``` #### 3. 实现具体处理器 ```java // 部门经理审批 public class DepartmentManager implements Approver { private Approver next; @Override public void setNextApprover(Approver next) { this.next = next; } @Override public void processRequest(Request request) { if (!request.isApproved()) { System.out.println("部门经理审批中..."); if (request.getContent().contains("常规")) { request.setApproved(true); } else if (next != null) { next.processRequest(request); } } } } // 人事总监审批 public class HRDirector implements Approver { private Approver next; // 类似实现... // 判断是否包含"人事调整"关键词 } // 总经理审批 public class GeneralManager implements Approver { // 终审处理器,无需设置next @Override public void processRequest(Request request) { System.out.println("总经理终审..."); request.setApproved(true); } } ``` #### 4. 组装责任链 ```java public class ChainBuilder { public static Approver buildChain() { Approver dm = new DepartmentManager(); Approver hr = new HRDirector(); Approver gm = new GeneralManager(); dm.setNextApprover(hr); hr.setNextApprover(gm); return dm; } } ``` #### 5. 客户端调用 ```java public class Client { public static void main(String[] args) { Request request = new Request("人事调整申请"); Approver chain = ChainBuilder.buildChain(); chain.processRequest(request); System.out.println("审批结果:" + request.isApproved()); } } ``` #### 模式特点: 1. **解耦请求与处理**:客户端只需触发第一个处理器 2. **动态扩展**:新增审批环节只需添加新处理器类 3. **灵活组合**:可通过改变链结构实现不同审批流程 [^1][^2][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值