职责链模式(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. 计算系数(noip2011)

    [问题描述]给定一个多项式(ax + by)^k,请求出多项式展开后(x^n)*(y^m)项的系数.[输入]输入文件名为 factor.in.共一行,包含 5 个整数,分别为a,b,k,n,m,每两个 ...

  2. 转:Java面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101

    Java面试题集(51-70) Java程序员面试题集(51-70) http://blog.csdn.net/jackfrued/article/details/17403101 摘要:这一部分主要 ...

  3. Canopy使用教程 (3)

    1. 2. plot函数: plot默认生成是曲线图,可以通过kind参数生成其他的图形,可选的值为:line, bar, barh, kde, density, scatter. 散点图.使用kin ...

  4. 安全攻城狮研发技能栈V1.0,附详细点评~

    2015-12-21 正宗好PT 正宗好PT 今天公司年会,又木有抽到奖,求安慰/(ㄒoㄒ)/~~ 言归正传,我曾经在推特发过一个Skill CheatSheet,被转发和点赞了几百次,我又更新了一下 ...

  5. ubuntu  输入时弹出剪切板候选项

    fcitx很坑的把这个功能的快捷键设置成了ctrl + ;结果我在用vim的时候怎么也 没法输入command 不知道是哪次更新引入的,简直是坑人! 我找了半天系统设置都没找到这个快捷键是在哪设置的. ...

  6. 刷固件Layer1到手机FLASH(硬刷)

    开头: 注意:本文章并不是做GSM 嗅探必须的,平时我们刷机叫软刷是刷到内存里面的,断电就消失了,这个是硬刷,刷到flash里面的,断电不消失,开机就运行的. 本文章经过作者实测可行,这只是单个应用程 ...

  7. Java 集合深入理解(14):Map 概述

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 终于把 List 常用的几种容器介绍完了,接下来开始 Map 的相关介绍. 什么是 Map Java 中的 Map 接口 ...

  8. 14、SQL基础整理(存储过程)

    存储过程procedure(proc) 数据库—可编程性—存储过程 新建存储过程: create proc firstproc as select *from fenshu go 执行存储过程: 存储 ...

  9. MongoDB在Windows下安装及配置

    第一步 下载MongoDB http://www.mongodb.org/downloads 第二步 解压到D:\mongodb\目录下,为了命令行的方便,可以把D:\mongodb\bin加到系统环 ...

  10. iOS-Block两个界面传值

    先说一下思路: 首先,创建两个视图控制器,在第一个视图控制器中创建一个Label和一个Button,其中Label是为了显示第二个视图控制器传过来的字符串, Button是为了push到第二个界面. ...