Java设计模式之《职责链模式》及应用场景
原创作品,可以转载,但是请标注出处地址: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设计模式之《适配器模式》及应用场景
- Java设计模式之《外观模式》及应用场景
- Java设计模式之《桥接模式》及应用场景
- Java设计模式之《单例模式》及应用场景
- Java设计模式之《观察者模式》及应用场景
- Java设计模式之《调停者模式》及应用场景
- Java设计模式之《代理模式》及应用场景
- Java设计模式之《职责链模式》及应用场景
- Java设计模式之《享元模式》及应用场景
- Java设计模式之《构建者模式》及应用场景
- Java设计模式之《模板模式》及使用场景
- Java设计模式之《装饰器模式》及应用场景
- Java设计模式之《工厂方法模式》及使用场景
- Java设计模式之《抽象工厂模式》及使用场景
Java设计模式之《职责链模式》及应用场景的更多相关文章
- java设计模式之组合模式
组合模式 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性.掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 & ...
- Java设计模式应用——组合模式
组合模式实际上是一种树形数据结构.以windows目录系统举例,怎么样用java语言描述一个文件夹? 定义一个文件夹类,文件夹类中包含若干个子文件类和若干个文件类. 进一步抽象,把文件夹和文件都看做节 ...
- java设计模式5.组合模式、门面模式、享元模式、桥接模式
组合模式 在面向对象的语言中,树结构有着巨大的威力,一个基于继承的类型的等级结构便是一个数结构,一个基于合成的对象结构也是一个数结构.组合模式将部分与整体的关系用树结构表示出来,使得客户端把一个个单独 ...
- JAVA设计模式之组合模式(composite)
组合模式:树状结构专用模式 代码如下: package com.srr.dp.composite; import java.util.ArrayList; import java.util.List; ...
- 老和尚给小和尚讲故事引发了Java设计模式:组合模式
目录 示例 组合模式 定义 意图 主要解决问题 优缺点 安全式和透明式的组合模式 安全式的合成模式的结构 透明式的合成模式的结构 老和尚和小和尚的故事 示例 有一个绘图系统,可以描绘各种图形,假设现在 ...
- Java设计模式之模板模式及使用场景
模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 折腾Java设计模式之访问者模式
博客原文地址:折腾Java设计模式之访问者模式 访问者模式 Represent an operation to be performed on the elements of an object st ...
随机推荐
- 第6组UI组件:ViewAnimator及其子类
ViewAnimator是一个基类,它继承了FrameLayout,因此它表现出FrameLayout的特征,可以将多个View组件“叠”在一起.ViewAnimator额外增加的功能正如它的名字所暗 ...
- Unity3D在NGUI中使用mask
过程是这样的:最近一直想做一个头像的mask效果,后来发现原来unity的mask需要用shader来写,网上找了不少资料,也能实现,不过大多数都是用render texture作为相机投影的text ...
- iis的web站点配置
1.下载好pageadmin网站系统,我下载的放在F:\web\site目录下(每个电脑或每个用户放置目录都不一样,你也可以放C:\myweb,或D:\xxx等等,只要下面对应目录设置一样即可),我们 ...
- spring mvc 资源包的映射
在springmvc.xml中进行设置: <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...
- MyBatis 延迟加载
在sqlMapConfig中进行设置 <configuration> <settings> <!--延迟加载的总开关--> <setting name=&qu ...
- 通过浏览器navigator判断浏览器版本或者手机类型&&判断微信访问
javascript 的navigator属性,不常用,但是用处也不少,主要用处是在做浏览器兼容的问题的时候,现在有的网站已经不兼容IE6,用户假如用IE6浏览网页的话,会提示浏览器升级等信息.或者判 ...
- jquery 高级 学习笔记
--jquery 和 原生js可以共存,但不能混用.jquery 可以通过get()方法 转换为原生js. $("#div1").get(0).innerHTML; get() 需 ...
- removeAll
问题:无法移除2个集合中相同元素 方法:移除所包含的其所有元素. 在执行removeAll方法时,会先对集合元素进行比较,如果元素相等才执行移除操作,说到这,相信很多人都已经明白是怎么回事了,因为不相 ...
- 调用win32 api 函数SendMessage() 实现消息直接调用
简单的调用例子, 适合初学者学习,当然 我也是初学者. #include <windows.h> #include <stdio.h> #include <stdlib. ...
- node.js 的事件机制
昨天到今天, 又看了一边node 的事件模块, 觉得很神奇~ 分享一下 - -> 首先, 补充下对node 的理解: nodeJs 是一个单进程单线程应用程序, 但是通过事件和回调支持并发 ...