责任链模式简介
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
责任链模式涉及到的角色如下所示:
● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
● 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
示例
1.简单案例:
抽象处理者角色
package sjms.zrl.simple;
public abstract class Handler {
/*
* 持有后继的责任对象
*/
protected Handler successor;
/*
* 示意处理请求的方法,此方法可以设置参数
*/
public abstract void handleRequest();
/*
* 取值方法
*/
public Handler getsuccessor(){
return successor;
}
/*
* 赋值方法,设置后继的责任对象
*/
public void setsuccessor(Handler successor){
this.successor=successor;
}
}
具体处理者角色
package sjms.zrl.simple;
public class ConcreateHandler extends Handler{
/*
* 处理方法,调用此方法处理请求
*/
@Override
public void handleRequest() {
// TODO Auto-generated method stub
if(getsuccessor()!=null)
{
System.out.println(this.getClass().getSimpleName()+"交给下一位处理!");
getsuccessor().handleRequest();
}else{
System.out.println("已经处理");
}
}
}
测试
package sjms.zrl.simple;
public class Client {
public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreateHandler();
Handler handler2 = new ConcreateHandler();
handler1.setsuccessor(handler2);
//处理请求
handler1.handleRequest();
}
}
复杂示例,员工报销
抽象处理这角色
package sjms.zrl.complex;
public abstract class Handler {
/*
* 持有下一个处理请求的对象
*/
protected Handler successor=null;
/*
* 获取下一个负责处理请求的对象
*/
public Handler getsuccessor(){
return successor;
}
/*
*设置下一个负责处理请求对象
*/
public void setsuccessor(Handler successor){
this.successor=successor;
}
/*
* 处理费用申请
*/
public abstract String dorequest(String user,double fee);
}
三个具体处理这角色,项目经理,部门经理,总经理
package sjms.zrl.complex;
public class ProjectManager extends Handler {
@Override
public String dorequest(String user, double fee) {
// TODO Auto-generated method stub
String str="";
//项目经理权限较小,只能处理500元一下的
if(fee<500){
//为了简单处理,只能处理张三的请求
if("张三".equals(user)){
str="成功:项目经理同意【"+user+"】"+"的请客费用,金额:"+fee+"元";
}else{ //其他人一律不同意
str = "失败:项目经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}
}else{ //超过500就交给部门领导处理
if(getsuccessor()!=null)
return getsuccessor().dorequest(user, fee);
else
return "请求异常,请检查";
}
return str;
}
}
**************
package sjms.zrl.complex;
public class DeptManager extends Handler {
@Override
public String dorequest(String user, double fee) {
// TODO Auto-generated method stub
String str="";
//部门经理权限较大,能处理1000元一下的
if(fee<1000){
//为了简单处理,只能处理张三的请求
if("张三".equals(user)){
str="成功:部门经理同意【"+user+"】"+"的请客费用,金额:"+fee+"元";
}else{ //其他人一律不同意
str = "失败:部门经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}
}else{
if(getsuccessor()!=null)
return getsuccessor().dorequest(user, fee);
else
return "请求异常,请检查";
}
return str;
}
}
**************
package sjms.zrl.complex;
public class GeneralManager extends Handler {
@Override
public String dorequest(String user, double fee) {
// TODO Auto-generated method stub
String str="";
//总经理权限较大,只能处理10000元一下的
if(fee>=1000){
//为了简单处理,只能处理张三的请求
if("张三".equals(user)){
str="成功:总经理同意【"+user+"】"+"的请客费用,金额:"+fee+"元";
}else{ //其他人一律不同意
str = "失败:总经理不同意【" + user + "】的聚餐费用,金额为" + fee + "元";
}
}else{ //超过1000就交给总领导处理
if(getsuccessor()!=null)
return getsuccessor().dorequest(user, fee);
else
return "请求异常,请检查";
}
return str;
}
}
测试
package sjms.zrl.complex;
public class Client {
public static void main(String[] args) {
//先组装责任链
Handler xmjl = new ProjectManager();
Handler bmjl = new DeptManager();
Handler zjl = new GeneralManager();
xmjl.setsuccessor(bmjl);
bmjl.setsuccessor(zjl);
//开始测试
String test1 = xmjl.dorequest("张三", 300);
System.out.println("test1 = " + test1);
String test2 = xmjl.dorequest("李四", 300);
System.out.println("test2 = " + test2);
System.out.println("---------------------------------------");
String test3 = xmjl.dorequest("张三", 700);
System.out.println("test3 = " + test3);
String test4 = xmjl.dorequest("李四", 700);
System.out.println("test4 = " + test4);
System.out.println("---------------------------------------");
String test5 = xmjl.dorequest("张三", 1500);
System.out.println("test5 = " + test5);
String test6 = xmjl.dorequest("李四", 1500);
System.out.println("test6 = " + test6);
}
}
第二部分:http://blog.csdn.net/fengzijinliang/article/details/51768831