【小话设计模式】行为型之责任链模式

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值