责任链模式
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 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 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 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)); } }
相关文章推荐
- 重写报销流程,责任链模式实现
- 责任链模式
- 闲谈责任链模式
- 责任链模式
- 责任链模式【java版】
- (三)二十三中设计模式之我见-------------责任链模式(Chain of Responsibility)
- 责任链模式(C++)
- 责任链模式
- Tomcat源码分析(四)--容器处理链接之责任链模式
- 大话设计模式_责任链模式
- 责任链模式(Chain of Responsibility Pattern)
- [重构到模式-Chain of Responsibility Pattern]把Fizz Buzz招式重构到责任链模式
- PHP设计模式漫谈之责任链模式
- 设计模式之责任链模式
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
- 设计模式系列课程20之【责任链模式】
- 第 17 章 责任链模式【Chain of Responsibility Pattern】
- 责任链模式
- 24种设计模式--责任链模式【Chain ofResponsibility Pattern】