基本介绍:
职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形成一条对象链。请求并不知道具体执行请求的对象是哪一个,这样就实现了请求与处理对象之间的解耦。
生活中这种情况其实很常见,公司部门之中,政府部门之中都有体现,在公司部门中,当你提交一份请求文件给你的直接上级时,你的直接上级可以处理这个文件,若他觉得自己不够资格,会将文件传递为他的直接上级,这样文件请求在这条链中传递,直到被某位感觉自己足够资格处理文件的人给处理掉为止,在政府部门也是如此。
示例代码实现:
package org.brando;
/**
*
* 类说明: 代码运行测试.
* @author Brando 2018年3月28日 上午10:51:49
*/
public class Launcher {
public static void main(String[] args) {
//初始化请假条.
ApplicationForLeave apply = new ApplicationForLeave();
apply.somebody = "Brando";
apply.something = "去度假.";
apply.hour = 72;
//初始化各个负责人.
ProjectManager pm = new ProjectManager(); //项目经理
ProjectCharge pc = new ProjectCharge(); //项目主管
ProjectDirector pd = new ProjectDirector(); //项目总监
//设置负责人的链式关系. 项目经理->项目主管->项目总监
pm.setNext(pc);
pc.setNext(pd);
//从链头开始提交.
pm.audit(apply);
//请假结果.
System.out.println("请假结果:" + apply.result);
}
}
package org.brando;
/**
*
* 类说明: 请假条
* @author Brando 2018年3月28日 上午10:54:35
*/
public class ApplicationForLeave {
/**某人**/
public String somebody;
/**某事**/
public String something;
/**请假时长**/
public int hour;
/**结果, true:同意, false:不同意**/
public boolean result = false;
}
package org.brando;
/**
*
* 类说明: 审核抽象类
* @author Brando 2018年3月28日 上午11:12:24
*/
public abstract class AAudit {
/**下一审核对象**/
protected AAudit next;
/**
*
* 方法说明: 审核.
* @author Brando 2018年3月28日 上午11:13:02
*/
public abstract void audit(ApplicationForLeave apply);
/**
*
* 方法说明: 设置下一个审核对象.
* @author Brando 2018年3月28日 上午11:22:22
* @param next 下一个审核人.
*/
public void setNext(AAudit next) {
this.next = next;
}
}
package org.brando;
/**
*
* 类说明: 项目经理类
* @author Brando 2018年3月28日 上午11:10:16
*/
public class ProjectManager extends AAudit {
@Override
public void audit(ApplicationForLeave apply) {
if(apply.hour <= 8) {
apply.result = true;
} else {
if(this.next != null) {
this.next.audit(apply);
}
}
}
}
package org.brando;
/**
*
* 类说明: 项目主管.
* @author Brando 2018年3月28日 上午11:10:16
*/
public class ProjectCharge extends AAudit {
@Override
public void audit(ApplicationForLeave apply) {
if(apply.hour <= 24) {
apply.result = true;
} else {
if(this.next != null) {
this.next.audit(apply);
}
}
}
}
package org.brando;
/**
*
* 类说明: 项目总监
* @author Brando 2018年3月28日 上午11:10:16
*/
public class ProjectDirector extends AAudit {
@Override
public void audit(ApplicationForLeave apply) {
if(apply.hour <= 40) {
apply.result = true;
} else {
if(this.next != null) {
this.next.audit(apply);
}
}
}
}