职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
   请求传递方向:从低级到高级
   重点:如何形成这个责任链
   特点:发出处理请求的客户端并不知道是系统当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。
1. 派生类中都具备的功能
(1) 都要设置后继者(一样)
(2) 都能实现自己职责范围内的功能(审批功能,具体审批细节不一样)
(3) 都具备把自己不能处理的请求传递给上级部门的功能(一样)

2.不同的功能

具体的处理情况不一样

3.例子以及代码实现

题目:已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5 万元至10 万元(不包括10 万元)的采购单,董事长可以审批10 万元至50 万元(不包括50 万元)的采购单,50万元及以上的采购单就需要开会讨论决定。采用责任链设计模式(Chain of Responsibility)。

3.1、请求类PurchaseRequest,采购请求的。

 package com.designmode.chainofresponsibility;

 public class PurchaseRequest {

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

PurchaseRequest

3.2、审批者的共同父类Approver

 package com.designmode.chainofresponsibility;

 public class Approver {

     private Approver successor; // 上级

     /**
* 采购单审批
*/
public void processRequest(PurchaseRequest request){
if (successor!=null) {
successor.processRequest(request);
}
} /**
* 设置上级
* @param successor
*/
public void setSuccessor(Approver successor){
this.successor=successor;
}
}

Approver

3.3、主任审批子类Director

 package com.designmode.chainofresponsibility;

 /**
* 主任审批
*/
public class Director extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()<50000){
System.out.println("主任审批了");
}else {
super.processRequest(request);
}
}
}

Director

3.4、副董事长审批子类VicePresident

 package com.designmode.chainofresponsibility;

 /**
* 副董事长审批
*/
public class VicePresident extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()>=50000&&request.getAmount()<100000){
System.out.println("副董事长审批审批了");
}else {
super.processRequest(request);
}
}
}

VicePresident

3.5、董事长审批子类President

 package com.designmode.chainofresponsibility;

 /**
* 董事长审批
*/
public class President extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()>=100000&&request.getAmount()<500000){
System.out.println("董事长审批审批了");
}else {
super.processRequest(request);
}
}
}

President

3.6、例会审批子类Congress

 package com.designmode.chainofresponsibility;

 /**
* 例会审批
*/
public class Congress extends Approver { public void processRequest(PurchaseRequest request){
if(request.getAmount()>=500000){
System.out.println("例会审批审批了");
}else {
super.processRequest(request);
}
}
}

Congress

3.7、测试类ApproverTest

 package com.designmode.chainofresponsibility;

 import java.util.Scanner;

 public class ApproverTest {

     @SuppressWarnings("resource")
public static void main(String[] args) {
Congress meeting = new Congress();
President president = new President();
VicePresident vicePresident = new VicePresident();
Director director = new Director(); // 构造责任链
director.setSuccessor(vicePresident);
vicePresident.setSuccessor(president);
president.setSuccessor(meeting); Scanner reader = new Scanner(System.in);
PurchaseRequest request = new PurchaseRequest();
request.setAmount(reader.nextInt());
director.processRequest(request); // 开始审批
}
}

ApproverTest

Java设计模式之责任链设计模式的更多相关文章

  1. Java中的责任链设计模式,太牛了!

    责任链设计模式的思想很简单,就是按照链的顺序执行一个个处理方法,链上的每一个任务都持有它后面那个任务的对象引用,以方便自己这段执行完成之后,调用其后面的处理逻辑. 下面是一个责任链设计模式的简单的实现 ...

  2. java filter过滤器及责任链设计模式

    什么是Filter? Filter属于sevlet规范,翻译为过滤器. Filter在web开发中有什么作用? 案例一:一个web站点只有用户登录才能继续访问该站点的资源,那么需要用户每次访问都判断是 ...

  3. Jfinal----Handler之责任链设计模式

    Jfinal handler的处理采用了责任链设计模式 有关责任链模式,推荐看: <JAVA与模式>之责任链模式 1.实现Handler只需要继承Handler public class ...

  4. JDK设计模式之——责任链(Filter)

    责任链的设计模式可以参考Servlet的FilterChain.FilterChain中的每个Filter(过滤器)就像一个个的链条 web开发中 有时候需要对接口request和response进行 ...

  5. javascript实现责任链设计模式

    javascript实现责任链设计模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理他为止. 这是Gof的定义 ...

  6. PHP责任链设计模式

    <?php //责任链设计模式 /** * 每个对象,储存着对自己上级的引用, * 如果自己处理不了,交给上一级. */ class board{ protected $power=1; pro ...

  7. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  8. C#设计模式:责任链模式

    设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...

  9. 23种设计模式之责任链模式(Chain of Responsibility)

    责任链模式是一种对象的行为型模式,避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止.责任链模式不保证每个请求都被接受, ...

随机推荐

  1. [VS]vs的宏

    宏的查看: 我们在Visual Studio中经常会接触到形如$(TargetFileName)这样的VS宏.它们不是全局宏,不能在一般CMD窗口中通过set命令查看, 但是可以通过VS的命令窗口打开 ...

  2. linux安装时出现your cpu does not support long mode的解决方法

    如果你确定你的电脑支持64bit且是64bit的宿主系统,则需要修改BIOS中的Inter Virtualization Technology为enabled.

  3. Activity(活动)-初讲

    是一种可以包含用户界面的组件,主要用于和用户进行交互. 上一次我们的MainActivity.java 是ADT帮我们自动创建的.手动创建Activity可以加深我们的理解和记忆,于是我们先自己手动创 ...

  4. hadoop版本和位数的查看方法

    目前针对apache hadoop更新的版本较多,由此而产生了两个方面的问题: 1.如何查看运行的集群当中的hadoop的版本的问题. 2.如何查看运行集群当中的hadoop的位数 下面详细的介绍一下 ...

  5. 自定义的BroadCastReceiver

    1.MainActivity2.java中的代码,主要是使用意图发送广播 public class MainActivity2 extends Activity{ @Override protecte ...

  6. (转)js函数参数设置默认值

    原文:http://www.cnblogs.com/RightDear/archive/2013/06/26/3156652.html js函数参数设置默认值   php有个很方便的用法是在定义函数时 ...

  7. RAID-4与模2和

    在网络传输和磁盘数据管理中经常涉及到的所谓奇偶校验:每N个bit之后加上一个bit保证这N + 1bit的模2和为0(也叫异或,一个意思) 而如果这其中出现了单bit错, 直接导致校验出差,出现偶数b ...

  8. Node.js的简介和安装

    一.Node.js的简介和安装 a)       什么是Node.js? Node.js是一个开发平台 让JavaScript运行在服务器端的开发平台 ---简单点说就是用JavaScript写服务器 ...

  9. FR #2题解

    A. 考虑把(u,v)的询问离线挂在u上,然后dfs,每次从fath[x]到[x]相当于x子树dis区间加1,x子树以外区间-1,然后维护区间和区间平方和等. 常数略大. #include<io ...

  10. python3爬虫再探之EXCEL(续)

    上篇介绍了xlsxwriter的用法,本来想写一下xlrd和xlwt的用法,看到这篇文章——http://blog.csdn.net/wangkai_123456/article/details/50 ...