1.概念
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
2.适用场景
假如使用if…else…语句来组织一个责任链时感到力不从心,代码看上去很糟糕时,就可以使用责任链模式来进行重构。
2.1优点
责任链模式与if…else…相比,他的耦合性要低一些,因为它把条件判定都分散到了各个处理类中,并且这些处理类的优先处理顺序可以随意设定。
2.2缺点
在找到正确的处理类之前,所有的判定条件都要被执行一遍,当责任链比较长时,性能问题比较严重。
3.应用举例
一个公司报销审批流程:
如果员工报销金额小于等于1000元,部门经理审批,如果是1000到2000元,大区经理审批;2000到20000,总经理审批;超过20000无人受理。
源码:
import java.math.BigDecimal;
/**
*
* 项目名称:设计模式
* 类名称:CommonProcess
* 类描述: 普通的处理类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午11:01:49
* @version 1.0
*
*/
public class CommonProcess {
public static void handleRequest(Request request){
BigDecimal bd = request.getSum();
if(bd.compareTo(new BigDecimal("500"))<=0){
System.out.println("小组长审批!");
}else if(bd.compareTo(new BigDecimal("1000"))<=0){
System.out.println("大区经理审批!");
}else if(bd.compareTo(new BigDecimal("2000"))<=0){
System.out.println("部门经理审批!");
}else if(bd.compareTo(new BigDecimal("20000.00"))<=0){
System.out.println("总经理审批!");
}else{
System.out.println("无人受理!");
}
}
}
import java.math.BigDecimal;
/**
*
* 项目名称:设计模式
* 类名称:Request
* 类描述:请求类(请求人姓名和报销金额)
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午10:47:18
* @version 1.0
*
*/
public class Request{
private BigDecimal sum;
private String cName;
public Request(String cName,BigDecimal sum){
this.cName = cName;
if(sum == null)
this.sum = new BigDecimal("0.0");
else
this.sum = sum;
}
public BigDecimal getSum() {
return sum;
}
public void setSum(BigDecimal sum) {
this.sum = sum;
}
public String getcName() {
return cName;
}
public void setcName(String cName) {
this.cName = cName;
}
}
/**
*
* 项目名称:设计模式
* 类名称:Handler
* 类描述:处理接口
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午10:46:13
* @version 1.0
*
*/
public interface Handler {
public void handlerRequest(Request request);
}
import java.math.BigDecimal;
/**
*
* 项目名称:设计模式
* 类名称:GeneralMangerHandler
* 类描述: 总经理处理类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午10:49:57
* @version 1.0
*
*/
public class GeneralMangerHandler implements Handler{
private Handler nextHandler;
public GeneralMangerHandler(Handler handler){
this.nextHandler = handler;
}
public void handlerRequest(Request request) {
if(request.getSum().compareTo(new BigDecimal("20000.00"))<0)
System.out.println("总经理审批了【"+request.getcName()+"】的报销申请,金额为:"+request.getSum());
else{
System.out.println("总经理审批不了,转交给上级领导审批!");
if(this.nextHandler != null){
this.nextHandler.handlerRequest(request);
}else{
System.out.println("无人受理!");
}
}
}
}
import java.math.BigDecimal;
/**
*
* 项目名称:设计模式
* 类名称:AreaManagerHandler
* 类描述:大区经理处理类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午10:45:37
* @version 1.0
*
*/
public class AreaManagerHandler implements Handler{
private Handler nextHandler;
public AreaManagerHandler(Handler handler){
this.nextHandler = handler;
}
public void handlerRequest(Request request) {
if(request.getSum().compareTo(new BigDecimal("2000.00"))<=0)
System.out.println("大区经理审批了【"+request.getcName()+"】的报销申请,金额为:"+request.getSum());
else{
System.out.println("大区经理审批不了,转交给上级领导审批!");
if(this.nextHandler != null){
this.nextHandler.handlerRequest(request);
}else{
System.out.println("无人受理!");
}
}
}
}
import java.math.BigDecimal;
/**
*
* 项目名称:设计模式
* 类名称:DeptManagerHandler
* 类描述: 部门经理处理类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午10:40:59
* @version 1.0
*
*/
public class DeptManagerHandler implements Handler{
private Handler nextHandler;
public DeptManagerHandler(Handler handler){
this.nextHandler = handler;
}
public void handlerRequest(Request request) {
if(request.getSum().compareTo(new BigDecimal("1000.00"))<=0)
System.out.println("部门经理审批了【"+request.getcName()+"】的报销申请,金额为:"+request.getSum());
else{
System.out.println("部门经理审批不了,转交给上级领导审批!");
if(this.nextHandler != null){
this.nextHandler.handlerRequest(request);
}else{
System.out.println("无人受理!");
}
}
}
}
import java.math.BigDecimal;
/**
*
* 项目名称:设计模式
* 类名称:GroupLeaderHandler
* 类描述: 小组长处理类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午10:48:49
* @version 1.0
*
*/
public class GroupLeaderHandler implements Handler {
private Handler nextHandler;
public GroupLeaderHandler(Handler handler){
this.nextHandler = handler;
}
public void handlerRequest(Request request) {
if(request.getSum().compareTo(new BigDecimal("500.00"))<0)
System.out.println("小组长审批了【"+request.getcName()+"】的报销申请,金额为:"+request.getSum());
else{
System.out.println("小组长审批不了,转交给上级领导审批!");
if(this.nextHandler != null){
this.nextHandler.handlerRequest(request);
}else{
System.out.println("无人受理!");
}
}
}
}
import java.math.BigDecimal;
/**
*
* 项目名称:设计模式
* 类名称:ProcessTest
* 类描述: 设计后审批流程测试类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 上午10:52:00
* @version 1.0
*
*/
public class ProcessTest {
public static void main(String[] args) {
Request request = new Request("尹若轩",new BigDecimal("14500"));
/**普通处理**/
CommonProcess.handleRequest(request);
System.out.println("*****************************************");
/**设计模式处理**/
GeneralMangerHandler gM = new GeneralMangerHandler(null);
DeptManagerHandler dM = new DeptManagerHandler(gM);
AreaManagerHandler aM = new AreaManagerHandler(dM);
GroupLeaderHandler gL = new GroupLeaderHandler(aM);
gL.handlerRequest(request);
}
}
运行结果:
总经理审批!
*****************************************
小组长审批不了,转交给上级领导审批!
大区经理审批不了,转交给上级领导审批!
部门经理审批不了,转交给上级领导审批!
总经理审批了【尹若轩】的报销申请,金额为:14500