原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html

  职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形成一条对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。

  生活中这种情况其实很常见,公司部门之中,政府部门之中都有体现,在公司部门中,当你提交一份请求文件给你的直接上级时,你的直接上级可以处理这个文件,若他觉得自己不够资格,会将文件传递为他的直接上级,这样文件请求在这条链中传递,直到被某位感觉自己足够资格处理文件的人给处理掉为止,在政府部门也是如此。

  职责链模式需要一个总接口,用来定义处理对象的公共部分(一般使用抽象类来定义),公共部分包括:一个后继处理器,设置和获取后继处理器的方法,具体的请求处理方法(这个方法需要在每个具体处理对象中实现),这里定义为抽象方法。

  我们就以公司部门为例来进行实例:

领导抽象类:Lingdao

 public abstract class Lingdao {
private Lingdao nextLingdao;
public Lingdao getNextLingdao() {
return nextLingdao;
}
public void setNextLingdao(Lingdao nextLingdao) {
this.nextLingdao = nextLingdao;
}
abstract void chuli(Files file);
}

领导实现类:Zongjingli、Fujingli、Bumenjingli

 /**
* 总经理
*/
public class Zongjingli extends Lingdao {
private final String name = "总经理";
private final int level = 0;//最大
@Override
public void chuli(Files file) {
if(this.level > file.getLevel()){
System.out.println(name + "未处理文件《" + file.getFileName() + "》");
getNextLingdao().chuli(file);
}else{
System.out.println(name + "处理了文件《" + file.getFileName() + "》");
}
}
} /**
* 副经理
*/
public class Fujingli extends Lingdao {
private final String name = "副经理";
private final int level = 1;
@Override
public void chuli(Files file) {
if(this.level > file.getLevel()){
System.out.println(name + "未处理文件《" + file.getFileName() + "》");
getNextLingdao().chuli(file);
}else{
System.out.println(name + "处理了文件《" + file.getFileName() + "》");
}
}
} /**
* 部门经理
*/
public class Bumenjingli extends Lingdao{
private final String name = "部门经理";
private final int level = 2;
@Override
public void chuli(Files file) {
if(this.level > file.getLevel()){
System.out.println(name + "未处理文件《" + file.getFileName() + "》");
getNextLingdao().chuli(file);
}else{
System.out.println(name + "处理了文件《" + file.getFileName() + "》");
}
}
}

文件类:Files

 public class Files {
private String fileName;
private int level;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
}

测试类:Clienter

 public class Clienter {
public static void main(String[] args) {
//定义职责链
Lingdao zongjingli = new Zongjingli();
Lingdao fujingli = new Fujingli();
Lingdao bumenjingli = new Bumenjingli();
bumenjingli.setNextLingdao(fujingli);
fujingli.setNextLingdao(zongjingli);
//定义两份文件
Files f1 = new Files();
f1.setFileName("正确对待旱鸭子");
f1.setLevel(1);
Files f2 = new Files();
f2.setFileName("年会在那里举行");
f2.setLevel(0);
//提交文件
bumenjingli.chuli(f1);
bumenjingli.chuli(f2);
}
}

执行结果:

部门经理未处理文件《正确对待旱鸭子》
副经理处理了文件《正确对待旱鸭子》
部门经理未处理文件《年会在那里举行》
副经理未处理文件《年会在那里举行》
总经理处理了文件《年会在那里举行》

  实例清晰易懂,职责链的模式重在这个链的组成,如何组成链呢?

    第一步需要在处理者对象类中定义后继处理者对象,将这部分代码抽象到抽象类中实现,降低了代码重复性。

    第二步就是在处理者对象类中的处理方法中如果当前处理者对象无法处理,就将其传递到后继对象去处理。

    第三步就是在测试类中将这些处理者类的实例串联成链。

  其实这个模式有个缺陷,那就是虽然可以实现请求额度传递,但是也不保证在这里链中一定存在能处理请求的处理这类,一旦不存在,那么这个请求将一直存在与链中,如果将链设置成环形,那么这个请求将会永远在环形链中传递不休;还有一点就是由于请求的传递,请求无法立即精确的找到处理者,处理效率会降低。


同系列文章:

Java设计模式之《职责链模式》及应用场景的更多相关文章

  1. java设计模式之组合模式

    组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...

  2. Java设计模式应用——组合模式

    组合模式实际上是一种树形数据结构.以windows目录系统举例,怎么样用java语言描述一个文件夹? 定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类. 进一步抽象,把文件夹和文件都看做节 ...

  3. java设计模式5.组合模式、门面模式、享元模式、桥接模式

    组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...

  4. JAVA设计模式之组合模式(composite)

    组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...

  5. 老和尚给小和尚讲故事引发了Java设计模式:组合模式

    目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...

  6. Java设计模式之模板模式及使用场景

    模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...

  7. Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景

    我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...

  8. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  9. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  10. 折腾Java设计模式之访问者模式

    博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...

随机推荐

  1. Delphi实例之一个较复杂的记事本的实现

    http://www.mamicode.com/info-detail-110813.html delphi中控件位置及自动排版的问题 http://blog.csdn.net/avan_lau/ar ...

  2. HDU-1598-find the most comfortable road(暴力+并查集)多看看,

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1598 题目思路:对于这个题目,可以先按速度的大小成小到大排序, 再成0 到 m ,把所有可以联通的道路 ...

  3. mysql 使用sqldump来进行数据库还原

    MYSQLdump参数详解 mysqldump备份: 复制代码代码如下: mysqldump -u用户名 -p密码 -h主机 数据库 a -w “sql条件” –lock-all-tables > ...

  4. iostat中 %util高 应用延迟高

    经过长时间监控,发现iostat 中的%util居高不下,一直在98%上下,说明带宽占用率极高,遇到了瓶颈. 且读写速度很慢,经过排查,发现是HBA卡出现问题,更换后,用dd if命令测试,磁盘的读写 ...

  5. Memcached Client的释疑

    1.目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcached是建立在libmemcached的基础 ...

  6. 关于GCD同步组实现多个异步线程的同步执行中的注意点

    在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...

  7. Apple官方IOS开发入门教程[v0.2]

    今天,又跑去找IOS开发入门教程了,结果发现没什么好的PDF. 后来发现,原来苹果官方有开发入门教程,而且写的很好.所以整理出来了,给大家分享一下. 我就不在这里贴pdf的内容了,下面有苹果官方教程的 ...

  8. JS中常见排序算法详解

    本文将详细介绍在JavaScript中算法的用法,配合动图生动形象的让你以最快的方法学习算法的原理以及在需求场景中的用途. 有句话怎么说来着: 雷锋推倒雷峰塔,Java implements Java ...

  9. Introduce: IEPI.BIATranscribe 图像表格拓写工具

    应用场合 数据表格是学术.文案工作中常用的表述形式.我们经常需要从第三方获取所需的数据.有些时候这些数据并非以可直接编辑的形式(如电子表格文档),而是以打印件或者扫描件的形式提供.假如需要对数据进行进 ...

  10. 计算机程序的思维逻辑 (64) - 常见文件类型处理: 属性文件/CSV/EXCEL/HTML/压缩文件

    对于处理文件,我们介绍了流的方式,57节介绍了字节流,58节介绍了字符流,同时,也介绍了比较底层的操作文件的方式,60节介绍了随机读写文件,61节介绍了内存映射文件,我们也介绍了对象的序列化/反序列化 ...