java中的责任链模式

1.责任链模式简介:

责任链模式设计的角色:

1.1抽象处理者角色:

1.2具体处理者角色

2.使用责任链模式模仿出差申请费的报销流程:

分心如下:

涉及到的对象:

以面向对象的思维应该讲责任链抽象为一个对象(HandlerChain)

HandlerChain:过滤器的抽象

ApplicationHandlerChain的具体实现

Request:封装的请求信息

Handler:抽象处理者

   ProjectManagerHandler项目经理处理

  SectionManagerHandler部门经理处理

 GeneralManager总经理处理:

3.代码实现:


HandlerChain 

package com.xinghengedu.chain;




/**
 * 奖责任链抽象为一个借口
 * @author issuser
 *
 */
public interface HandlerChain {
	
	/**
	 * 责任链中传递
	 */
	public  HandlerChain  doChain(Request request);


}


Request::

package com.xinghengedu.chain;

import java.util.Date;

/**
 * 封装申请的参数
 * 
 * @author issuser
 * 
 */
public class Request {

	/**
	 * 申请的名称
	 */
	private String applyName;

	/**
	 * 申请的额度
	 */
	private Double amount;

	/**
	 * 提交申请的时间
	 * 
	 */
	private Date createDate;

	/**
	 * 神审批的时间
	 */
	private Date handlerDate;

	public String getApplyName() {
		return applyName;
	}

	public void setApplyName(String applyName) {
		this.applyName = applyName;
	}

	public Double getAmount() {
		return amount;
	}

	public void setAmount(Double amount) {
		this.amount = amount;
	}

	public Date getCreateDate() {
		return createDate;
	}

	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}

	public Date getHandlerDate() {
		return handlerDate;
	}

	public void setHandlerDate(Date handlerDate) {
		this.handlerDate = handlerDate;
	}

}

ApplicationHandlerChain:

package com.xinghengedu.chain;

import java.util.ArrayList;
import java.util.List;

public class ApplicationHandlerChain implements HandlerChain {
	
	
	private   List<Handler>  handlerList=new ArrayList<Handler>();
	
	
	
	public ApplicationHandlerChain(List<Handler>  handlerList) {
		this.handlerList=handlerList;
	}

	int  i=0;

	@Override
	public HandlerChain doChain(Request request) {
		if(this.i<handlerList.size()){
			this.getHandler().doHandler(this, request);
		}else{
			System.out.println("未找到合适的处理方式");
		}
		
		return null;
	}
	
	public  void  addHandler(Handler handler){
		this.handlerList.add(handler);
	}
	
	private   Handler  getHandler(){
		return  this.handlerList.get(i);
	}

	

}

Handler:

package com.xinghengedu.chain;

/**
 * 抽象处理者
 * 
 * @author issuser
 * 
 */
public interface Handler {

	/**
	 * 处理
	 * 
	 * @param handlerChain
	 */
	public void doHandler(HandlerChain handlerChain,Request request);

	/**
	 * 向后传递
	 */

	public void doNext(HandlerChain handlerChain,Request request);
}


ProjectManagerHandler:


package com.xinghengedu.chain;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 具体处理者角色:项目经理处理(如果申请的额度<=1000,项目经理可以处理)
 * 
 * @author issuser
 * 
 */
public class ProjectManagerHandler implements Handler {

	@Override
	public void doHandler(HandlerChain handlerChain, Request request) {
		
		double  amount=request.getAmount();
		String name=request.getApplyName();
		System.out.println("申请的额度为"+amount);
		System.out.println("申请人的姓名为"+name);
		if(amount<=1000){
			System.out.println("项目经理审批");
			System.out.println("项目经理审批的时间为:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
		}else{
			this.doNext(handlerChain, request);
		}

	}

	@Override
	public void doNext(HandlerChain handlerChain, Request request) {
		ApplicationHandlerChain applicationHandlerChain= (ApplicationHandlerChain)handlerChain;
		applicationHandlerChain.i++;
		handlerChain.doChain(request);
	}

}

SectionManagerHandler:

package com.xinghengedu.chain;

import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * 具体处理者:部门经理
 * @author issuser
 *
 */
public class SectionManagerHandler  implements Handler {



	@Override
	public void doHandler(HandlerChain handlerChain ,Request request) {
		double  amount=request.getAmount();
		String name=request.getApplyName();
		System.out.println("申请的额度为"+amount);
		System.out.println("申请人的姓名为"+name);
		if(amount>1000&&amount<=3000){
			System.out.println("部门经理审批");
			System.out.println("部门经理审批的时间为:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
		}else{
			this.doNext(handlerChain, request);
		}
	}

	@Override
	public void doNext(HandlerChain handlerChain,Request request) {
		ApplicationHandlerChain applicationHandlerChain= (ApplicationHandlerChain)handlerChain;
		applicationHandlerChain.i++;
		handlerChain.doChain(request);
	}


}

GeneralManager:



package com.xinghengedu.chain;

import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * 具体产品角色:总经理
 * @author issuser
 *
 */
public class GeneralManager implements Handler{

	@Override
	public void doHandler(HandlerChain handlerChain, Request request) {
		double  amount=request.getAmount();
		String name=request.getApplyName();
		System.out.println("申请的额度为"+amount);
		System.out.println("申请人的姓名为"+name);
		if(amount>3000){
			System.out.println("总经理审批");
			System.out.println("总经理审批的时间为:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()));
		}else{
			this.doNext(handlerChain, request);
		}		
	}

	@Override
	public void doNext(HandlerChain handlerChain, Request request) {
		ApplicationHandlerChain applicationHandlerChain= (ApplicationHandlerChain)handlerChain;
		applicationHandlerChain.i++;
		handlerChain.doChain(request);
		
	}




}


client:

package com.xinghengedu.chain;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 责任链模式:
 * 1.抽象处理者
 * 2.具体处理者
 * 3.客户端
 * @author issuser
 *
 */

public class client {

	
	
	public static void main(String[] args) {

		List<Handler> list=new ArrayList<Handler>();
		list.add(new ProjectManagerHandler());
		list.add(new SectionManagerHandler());
		list.add(new GeneralManager());
		Request request=new  Request();
		request.setAmount(3001.00);
		request.setApplyName("柯凡");
		request.setCreateDate(new Date());
		new ApplicationHandlerChain(list).doChain(request);
	}
}





4.运行效果如下:









猜你喜欢

转载自blog.csdn.net/kpp19920121/article/details/52164125