栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java设计模式之【职责链模式】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java设计模式之【职责链模式】

职责链模式
  • 业务需求:
    OA系统采购审批需求(学校OA系统的采购审批项目):
    • 采购员采购教学器材
    • 如果金额小于5000,由教务主任审批【 0 <= x <= 5000 】
    • 如果金额小于10000,由院长审批 【 5000 < x <= 10000 】
    • 如果金额小于30000,由副院长审批 【 10000 < x <= 30000 】
    • 如果金额超过30000,由校长审批 【 30000 < x 】
      请设计程序完成采购审批项目。
  • 解决方案:
    • 传统方案:
      • 方式:接受到一个请求后,根据采购金额来调用对用的审批人完成审批。(使用【if–eles-if-eles】||【switch】进行金额判断)
      • 问题分析:客户端这里使用到分支判断来对不同的采购请求处理,这样就存在如下问题:
        • 如果各个级别的人员审批金额发生变化,在客户端的也需要变化
        • 客户端必须明确的知道有多少个审批级别和访问这样对一个采购请求处理和审批人就存在强耦合关系,不利于代码的扩展和维护
      • 解决方案:责任链模式
    • 职责链模式(Chain of Responsibility pattern)
      • 基本介绍
        • 又叫责任链模式
        • 为请求创建了一个接收者对象的链。这种模式对请求的发送者和接收者进行解耦。
        • 责任链模式通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传递给下一个接受者,依此类推。
      • 原理类图
        使多个对象都有机会处理请求,从而避免亲求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理为止。
        • Handler :抽象的处理者,定义了一个处理请求的接口,同时包含了另外一个Handler
        • ConcreteHandlerA、ConcreteHandlerB是具体的处理者,处理它自己负责的请求,可以访问他的后继者(即下一个处理者),如果可以处理当前请求,则处理,否则就将该请求交给后继者去处理,从而形成一个职责链
        • Request:含有很多属性,表示一个请求
      • 业务类图
      • 代码实现
        • 创建请求处理对象(PurchaseRequest.java)

          package ltd.huazhongyang.responsibilitychain;
          
          public class PurchaseRequest {
              
              private int type = 0 ;
              
              private  double price = 0.0 ;
              
              private int id = 0 ;
              //构造器
              public PurchaseRequest(int type,  double price, int id) {
                  this.type = type;
                  this.price = price;
                  this.id = id;
              }
              public int getType() {
                  return type;
              }
              public double getPrice() {
                  return price;
              }
              public int getId() {
                  return id;
              }
          }
          
        • 创建审批人抽象类

          package ltd.huazhongyang.responsibilitychain;
          
          
          public abstract class Approver {
          
              
              private Approver approver ;
          
              
              String name ;
          
              public Approver(String name ){
                  this.name = name ;
              }
          
              
              public void setApprover(Approver approver) {
                  this.approver = approver;
              }
          
              
              public Approver getApprover() {
                  return approver;
              }
          
              
              public abstract  void processRequest(PurchaseRequest purchaseRequest);
          }
          
        • 创建审批人为主任的类,并继承审批Approver.java抽象类

          package ltd.huazhongyang.responsibilitychain;
          
          public class DepartmentApprover extends Approver{
          
              public DepartmentApprover(String name) {
                  super(name);
              }
          
              @Override
              public void processRequest(PurchaseRequest purchaseRequest) {
                  System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】");
                  if (purchaseRequest.getPrice() < 5000){
                      System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理");
                  }else {
                      System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求");
                      super.getApprover().processRequest(purchaseRequest);
                  }
          
              }
          }
          
          
        • 创建审批人为院长的类,并继承审批Approver.java抽象类

          package ltd.huazhongyang.responsibilitychain;
          
          public class CollegeApprover extends Approver{
          
              public CollegeApprover(String name) {
                  super(name);
              }
          
              @Override
              public void processRequest(PurchaseRequest purchaseRequest) {
                  System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】");
                  if (5000 <= purchaseRequest.getPrice() && purchaseRequest.getPrice() < 10000){
                      System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理");
                  }else {
                      System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求");
                      super.getApprover().processRequest(purchaseRequest);
                  }
          
              }
          }
          
        • 创建审批人为副校长的类,并继承审批Approver.java抽象类

          package ltd.huazhongyang.responsibilitychain;
          
          public class ViceSchoolMasterApprover extends Approver{
          
              public ViceSchoolMasterApprover(String name) {
                  super(name);
              }
          
              @Override
              public void processRequest(PurchaseRequest purchaseRequest) {
                  System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】");
                  if (10000 <= purchaseRequest.getPrice() && purchaseRequest.getPrice() < 30000){
                      System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理");
                  }else {
                      System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求");
                      super.getApprover().processRequest(purchaseRequest);
                  }
          
              }
          }
          
        • 创建审批人为校长的类,并继承审批Approver.java抽象类

          package ltd.huazhongyang.responsibilitychain;
          
          public class ViceSchoolMasterApprover extends Approver{
          
              public ViceSchoolMasterApprover(String name) {
                  super(name);
              }
          
              @Override
              public void processRequest(PurchaseRequest purchaseRequest) {
                  System.out.println("金额为:【"+String.valueOf(purchaseRequest.getPrice())+"】");
                  if (10000 <= purchaseRequest.getPrice() && purchaseRequest.getPrice() < 30000){
                      System.out.println("请求编号:id = "+purchaseRequest.getId()+" 被 【 "+this.name+" 】处理");
                  }else {
                      System.out.println("-->"+this.name+":请求无法处理,交给下一级处理请求");
                      super.getApprover().processRequest(purchaseRequest);
                  }
          
              }
          }
          
        • 创建启动类

          package ltd.huazhongyang.responsibilitychain;
          
          public class Client {
              public static void main(String[] args) {
                  PurchaseRequest purchaseRequest = new PurchaseRequest(1, 21000, 1);
                  //创建相关的审批人
                  DepartmentApprover departmentApprover = new DepartmentApprover("张主任");
                  CollegeApprover collegeApprover = new CollegeApprover("李院长");
                  ViceSchoolMasterApprover viceSchoolMasterApprover = new ViceSchoolMasterApprover("王副校长");
                  SchoolMasterApprover schoolMasterApprover = new SchoolMasterApprover("赵校长");
          
                  //需要将各个审批级别的下一个设置好(处理人构成环形:)
                  departmentApprover.setApprover(collegeApprover);
                  collegeApprover.setApprover(viceSchoolMasterApprover);
                  viceSchoolMasterApprover.setApprover(schoolMasterApprover);
                  schoolMasterApprover.setApprover(departmentApprover);
          
                  schoolMasterApprover.processRequest(purchaseRequest);
          
              }
          
          }
          
        • 测试结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434211.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号