您的位置:首页 > 其它

责任链模式

2013-12-25 15:12 127 查看
定义:使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这些对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

要想让处理的流程可以灵活变动,一个基本的思路就是,动态的构建流程,那样随时可以组合出新的流程来。

首先:责任链模式定义一个所以处理请求的对象都要继承的抽象类,这样就有利于随时切换新的实现。

其次:每个处理请求对象只实现业务流程中的一个业务处理,这样使其变得简单,

最后:责任链会动态的组合这些处理请求的对象,把他们按照流程动态组合,并要求他们依次调用

示例代码

public abstract class Handler {
/**
* 持有后继的职责对象
*/
protected Handler successor;

public void setSuccessor(Handler suHandler){
this.successor = suHandler;
}

/**
* 示意处理请求的方法
*/
public abstract void handleRequest();

}
public class HandlerImplA extends Handler {
@Override
public void handleRequest() {
// TODO Auto-generated method stub
boolean someCondition = false;
if(someCondition){
//属于自己的处理范围
System.out.println("handle");
}else{
//交给下一个处理
if(this.successor!=null){
this.successor.handleRequest();
}
}
}
}


经费处理示例代码:

public abstract class Handler {
/**
* 持有下一个处理请求对象
*/
protected Handler succesor ;
/**
* 设置下一个处理请求对象
* @param succesor
*/
public void setSuccesor(Handler succesor){
this.succesor = succesor;
}
/**处理申请
* @param user 申请人
* @param fee 经费
* @return 成功或失败的具体通知
*/
public abstract String handleFeeRequest(String user,double fee);
}
public class ProjectManager extends Handler {
@Override
public String handleFeeRequest(String user, double fee) {
String str = "";
if(fee<500){
if("xihe".equals(user)){
str = "项目经理同意"+user+"聚餐费用"+fee+"元的请求";
}else{
str = "项目经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}else{
if(this.succesor!=null){
return this.succesor.handleFeeRequest(user, fee);
}
}
return str;
}
}


public class DeptManager extends Handler {
@Override
public String handleFeeRequest(String user, double fee) {
String str = "";
if(fee<1000){
if("xihe".equals(user)){
str = "部门经理同意"+user+"聚餐费用"+fee+"元的请求";
}else{
str = "部门经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}else{
if(this.succesor!=null){
return this.succesor.handleFeeRequest(user, fee);
}
}
return str;
}
}

public class GeneralManager extends Handler {
@Override
public String handleFeeRequest(String user, double fee) {
String str = "";
if(fee>=1000){
if("xihe".equals(user)){
str = "总经理同意"+user+"聚餐费用"+fee+"元的请求";
}else{
str = "总经理不同意"+user+"聚餐费用"+fee+"元的请求";
}
return str;
}else{
if(this.succesor!=null){
return this.succesor.handleFeeRequest(user, fee);
}
}
return str;
}
}
public class Client {
public static void main(String[] args) {
Handler pro = new ProjectManager();
Handler dep = new DeptManager();
Handler gen = new GeneralManager();
pro.setSuccesor(dep);
dep.setSuccesor(gen);
System.out.println(pro.handleFeeRequest("xihe", 800));
System.out.println(pro.handleFeeRequest("jingli", 800));
System.out.println(pro.handleFeeRequest("xihe", 200));
System.out.println(pro.handleFeeRequest("xihe", 1400));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: