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.运行效果如下: