原创作品,可以转载,但是请标注出处地址: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. C#的显式接口和隐式接口(转载)

    接口的实现分为:隐式实现和显式实现.如果类或者结构要实现的是单个接口,可以使用隐式实现,如果类或者结构继承了多个接口那么接口中相同名称成员就要显式实现.显示实现是通过使用接口的完全限定名来实现接口成员 ...

  2. Android应用的基本组件介绍和签名Android应用程序

    一.Android应用的基本组件介绍  Activity和View :Activity只能通过setContentView(View)来显示指定的组件.View组件是所有UI控件.容器控件的基类,Vi ...

  3. 把记事本文件固定在Win8的开始屏幕

    1.创建该文件的桌面快捷方式: 2.将快捷方式拷贝至开始菜单目录,在开始屏幕的查看全部中可以看见该文件快捷: 3.在查看全部中右键点击该快捷,选择固定在开始屏幕:

  4. Spring内部bean无法通过id获取

    内部Bean注入正常,但是直接在context中getBean是得不到的: <?xml version="1.0" encoding="UTF-8"?&g ...

  5. Java中的封装、继承、多态

    封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开 ...

  6. 浅谈Socket长连+多线程[原创,欢迎指点]

    前戏 [PS:原文手打,转载说明出处] [PS:博主自认为适用于云平台设备管控,且适用于IM主控] 好久没来了,13年时还想着多写一些博客,这都17年过年,年前也写一写Scoket+多线程,不足之处, ...

  7. POJ2187(旋转卡壳)

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 35459   Accepted: 10978 ...

  8. Hadoop-2.x启动HDFS和YARN的方式

    逐一启动(实际生产环境中的启动方式) * sbin/hadoop-daemon.sh start|stop namenode|datanode|journalnode * sbin/yarn-daem ...

  9. java精度计算代码,指定精确小数位

    java代码: public class App2 { public static void main(String[] args) { String val = checkNumber(" ...

  10. ArcGIS Pro 简明教程(3)数据编辑

    ArcGIS Pro 简明教程(3)数据编辑 by 李远祥 数据编辑是GIS中最常用的功能之一,ArcGIS Pro在GIS数据编辑上使用习惯有一定的改变,因此,本章可以重点看看一些编辑工具的使用和使 ...