您的位置:首页 > 编程语言 > Java开发

java中的责任链模式

2016-08-09 16:48 141 查看

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 ApplicationHandlerChainimplements HandlerChain{

private List<Handler> handlerList=new ArrayList<Handler>();

public ApplicationHandlerChain(List<Handler> handlerList) {
this.handlerList=handlerList;
}

int i=0;

@Override
public HandlerChaindoChain(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(HandlerChainhandlerChain,Request request);

/**
* 向后传递
*/

public void doNext(HandlerChainhandlerChain,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(HandlerChainhandlerChain, 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(HandlerChainhandlerChain, Request request) {
ApplicationHandlerChainapplicationHandlerChain= (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(HandlerChainhandlerChain ,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(HandlerChainhandlerChain,Request request) {
ApplicationHandlerChainapplicationHandlerChain= (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(HandlerChainhandlerChain, 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(HandlerChainhandlerChain, Request request) {
ApplicationHandlerChainapplicationHandlerChain= (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.运行效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: