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); } }