职责链模式(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. Git搭建团队开发环境操作演练

    模拟创建远程git仓库 1.首先创建如下目录结构: /Users/hujh/Desktop/GitTest2/GitServer/weibo weibo是我们要创建的项目 2.切换目录 $ cd /U ...

  2. 【SQL查询日志】查看数据库历史查询记录

    --关键字:cross apply & outer apply --最后更新:2011-10-20 作者:Ronli--更新链接:http://www.cnblogs.com/ronli/ar ...

  3. python练习——水仙花数

    题目: 请判断一个数是不是水仙花数.其中水仙花数定义各个位数立方和等于它本身的三位数.输入有多组测试数据,每组测试数据以包含一个整数n(100<=n<1000)输入0表示程序输入结束.输出 ...

  4. DDOS攻击原理及防护方法论

      从 07年的爱沙尼亚DDOS信息战,到今年广西南宁30个网吧遭受到DDOS勒索,再到新浪网遭受DDOS攻击无法提供对外服务500多分钟. DDOS愈演愈烈,攻击事件明显增多,攻击流量也明显增大,形 ...

  5. SQL实现字段内容查找和替换

  6. 前端开发者应该知道的 CSS 小技巧

    一些小技巧让你的CSS技术更专业 使用:not()去除导航上不需要的边框 为body添加行高 垂直居中任何元素 逗号分离的列表 使用负nth-child选择元素 使用SVG图标 文本显示优化 在纯CS ...

  7. html5zero 网站模板 影片素材

    1. http://www.html5zero.com/ HTML5 Zero 收录来自各个网站的网站模版资源,支持响应式网页设计,部分能直接套用于 WordPress.Bootstrap 外,有 M ...

  8. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  9. Inno Setup入门(十一)——完成安装后执行某些程序

    Inno Setup入门(十一)——完成安装后执行某些程序 2011-02-16 16:24:23|  分类: Inno Setup |  标签:inno  setup   |举报 |字号 订阅   ...

  10. iOS-TCP/IP、Http、Socket的区别

    网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...