深入Java设计模式之责任链模式

简介: 深入Java设计模式之责任链模式

责任链模式原理

如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

责任链模式优缺点

优点:  将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求  可以简化对象,因为它无须知道链的结构  可以动态地增加或删减处理请求的链结构

缺点:  请求从链的开头进行遍历,对性能有一定的损耗  并不保证请求一定被处理

适用场合

有多个对象可以处理一个请求  不明确接收者的情况  有序、无序链,线型、树形、环形链

 

责任链模式和状态模式主要区别

责任链模式注重请求的传递  状态模式注重对象状态的转换

 

责任链模式示例代码

购买请求决策项目介绍

场景:财务审批  

1.小组领导接到的审批 小于5000小组领导审批,否则执行2

2.部门领导接到的审批 大于5000 且小于10000部门领导审批,否则执行3

3.副主席接到的审批     大于10000且小于50000副主席审批,否则执行4

4.主席接到的审批         大于50000主席审批,否则执行1

考虑扩展性 思考如何设计

 

package com.lzhsite.technology.designPattern.chainms;
public class MainTest {
  public static void main(String[] args) {
    Client mClient = new Client();
    Approver GroupLeader = new GroupApprover("Tom");
    Approver VicePresident = new VicePresidentApprover("Kate");
    Approver DepartmentLeader = new DepartmentApprover("Jerry");
    Approver President = new PresidentApprover("Bush");
    GroupLeader.SetSuccessor(DepartmentLeader);
    DepartmentLeader.SetSuccessor(VicePresident);
    VicePresident.SetSuccessor(President);
    President.SetSuccessor(GroupLeader);
    VicePresident.ProcessRequest(mClient.sendRequst(1, 100, 40));
    VicePresident.ProcessRequest(mClient.sendRequst(2, 200, 40));
    VicePresident.ProcessRequest(mClient.sendRequst(3, 300, 40));
    VicePresident.ProcessRequest(mClient.sendRequst(4, 400, 140));
  }
}

 

package com.lzhsite.technology.designPattern.chainms;
public abstract class Approver {
   Approver successor;
   String Name;
  public Approver(String Name)
  {
    this.Name=Name;
  }
  public abstract void ProcessRequest( PurchaseRequest request);
  public void SetSuccessor(Approver successor) {
    // TODO Auto-generated method stub
    this.successor=successor;
  }
}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 组内领导审批
 * @author lzhcode
 *
 */
public class GroupApprover extends Approver {
  public GroupApprover(String Name) {
    super(Name+" GroupLeader");
    // TODO Auto-generated constructor stub
  }
  @Override
  public void ProcessRequest(PurchaseRequest request) {
    // TODO Auto-generated method stub
    if (request.GetSum() < 5000) {
      System.out.println("**This request " + request.GetID()
          + " will be handled by "
          + this.Name + " **");
    } else {
      successor.ProcessRequest(request);
    }
  }
}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 部门领导审批
 * @author lzhcode
 *
 */
public class DepartmentApprover extends Approver {
  public DepartmentApprover(String Name) {
    super(Name + " DepartmentLeader");
  }
  @Override
  public void ProcessRequest(PurchaseRequest request) {
    // TODO Auto-generated method stub
    if ((5000 <= request.GetSum()) && (request.GetSum() < 10000)) {
      System.out.println("**This request " + request.GetID()
          + " will be handled by " + this.Name + " **");
    } else {
      successor.ProcessRequest(request);
    }
  }
}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 副总经理审批
 * @author lzhcode
 *
 */
public class VicePresidentApprover extends Approver {
  public VicePresidentApprover(String Name) {
    super(Name + " Vice President");
  }
  @Override
  public void ProcessRequest(PurchaseRequest request) {
    // TODO Auto-generated method stub
    if ((10000 <= request.GetSum()) && (request.GetSum() < 50000)) {
      System.out.println("**This request " + request.GetID()
          + " will be handled by " + this.Name + " **");
    } else {
      successor.ProcessRequest(request);
    }
  }
}
package com.lzhsite.technology.designPattern.chainms;
/**
 * 副总经理审批
 * @author lzhcode
 *
 */
public class VicePresidentApprover extends Approver {
  public VicePresidentApprover(String Name) {
    super(Name + " Vice President");
  }
  @Override
  public void ProcessRequest(PurchaseRequest request) {
    // TODO Auto-generated method stub
    if ((10000 <= request.GetSum()) && (request.GetSum() < 50000)) {
      System.out.println("**This request " + request.GetID()
          + " will be handled by " + this.Name + " **");
    } else {
      successor.ProcessRequest(request);
    }
  }
}
package com.lzhsite.technology.designPattern.chainms;
public class Client {
  public Client() {
  }
  public PurchaseRequest sendRequst(int Type, int Number, float Price) {
    return new PurchaseRequest(Type, Number, Price);
  }
}
package com.lzhsite.technology.designPattern.chainms;
public class PurchaseRequest {
  private int Type = 0;
  private int Number = 0;
  private float Price = 0;
  private int ID = 0;
  public PurchaseRequest(int Type, int Number, float Price) {
    this.Type = Type;
    this.Number = Number;
    this.Price = Price;
  }
  public int GetType() {
    return Type;
  }
  public float GetSum() {
    return Number * Price;
  }
  public int GetID() {
    return (int) (Math.random() * 1000);
  }
}

 


相关文章
|
30天前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
26天前
|
设计模式 Java 数据库连接
【重温设计模式】代理模式及其Java示例
【重温设计模式】代理模式及其Java示例
|
30天前
|
设计模式 Java
Java责任链模式
Java责任链模式
25 0
|
1月前
|
设计模式 监控 Java
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
【设计模式】JAVA Design Patterns——Circuit Breaker(断路器模式)
|
1天前
|
设计模式 开发框架 Java
java设计模式面试题大全含答案
java设计模式面试题大全含答案
|
2天前
|
设计模式 监控 安全
屏幕监控软件的设计模式:深入理解Java EE
在Java EE环境中,屏幕监控软件采用生产者-消费者设计模式,`ScreenCaptureProducer`类捕获屏幕数据并放入队列,`ScreenCaptureConsumer`负责处理和提交。数据每5分钟通过定时任务和RESTful API自动提交至网站,提升管理效率。该方案支持实时监控、数据分析和高效的数据处理。
18 2
|
28天前
|
设计模式 Java 数据库
【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式旨在实现不同类型间的双向转换,减少样板代码。它通过通用的Converter类和特定的转换器(如UserConverter)简化实例映射。Converter类包含两个Function对象,用于不同类型的转换,同时提供列表转换方法。当需要在逻辑上对应的类型间转换,或处理DTO、DO时,此模式尤为适用。
【设计模式】JAVA Design Patterns——Converter(转换器模式)
|
8天前
|
设计模式 存储 安全
Java中的23种设计模式
Java中的23种设计模式
9 1
|
2天前
|
设计模式 Java Spring
java设计模式总结
java设计模式总结
|
26天前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)