前几天面试,面试官问我一个问题,servlet的过滤器的使用的是什么设计模式,当时我并不知道,因此就随便说了一个代理模式。面试完后经过查询了解到,servlet的过滤器的使用的责任链模式。通过对责任链模式的学习了解,发现工作中已经用到。
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
现在通过一个请假例子来详细说明责任链模式!角色:TeamLeader,CTO,CEO;TeamLeader有5天假的权利,CTO有10天假的权利,CEO是老板,只要他同意就行!!!!
抽象处理类
public abstract class Handler {
/**
* 继承者,责任链上的下一个处理人.
*/
private Handler leader;
/**
*
* 处理请求.
*
* @param req 请求
* @return String返回值
*/
public abstract boolean handRequest(int days);
/**
* 设置leader.
* @return 返回leader
*/
public Handler getLeader() {
return leader;
}
/**
* 获取leader.
* @param leader 要设置的leader
*/
public void setLeader(Handler leader) {
this.leader = leader;
}
}
TeamLeader处理类
public class TeamLeaderHandler extends Handler{
@Override
public boolean handRequest(int days) {
boolean flag=false;
if (days<=5) {
System.out.println("TeamLeader:申请通过!!!");
} else if (this.getLeader()!=null) {
System.out.println("TeamLeader:超过5天我没权利!!!");
this.getLeader().handRequest(days);
} else {
System.out.println("TeamLeader:申请不通过!!!");
}
return flag;
}
}
CTO处理类
public class CTOHandler extends Handler{
@Override
public boolean handRequest(int days) {
boolean flag=false;
if (days<=10) {
System.out.println("CTO:申请通过!!!");
} else if (this.getLeader()!=null) {
System.out.println("CTO:超过10天我没权利!!!");
this.getLeader().handRequest(days);
} else {
System.out.println("CTO:申请不通过!!!");
}
return flag;
}
}
CEO处理类
public class CEOHandler extends Handler{
@Override
public boolean handRequest(int days) {
boolean flag=true;
System.out.println("CEO:我是老板,我说了算!!!");
System.out.println("CEO:申请通过!!!");
return flag;
}
}
我要请假啦
public class AskForLeave {
public static void main(String[] args) {
Handler handler=new TeamLeaderHandler();
CTOHandler cto = new CTOHandler();
cto.setLeader(new CEOHandler());
handler.setLeader(cto);
System.out.println("================第一次请假================");
handler.handRequest(5); //请假5天
System.out.println("================第二次请假================");
handler.handRequest(10); //请假10天
System.out.println("================第三次请假================");
handler.handRequest(30); //请假30天
}
}
我的三次请假结果
================第一次请假================
TeamLeader:申请通过!!!
================第二次请假================
TeamLeader:超过5天我没权利!!!
CTO:申请通过!!!
================第三次请假================
TeamLeader:超过5天我没权利!!!
CTO:超过10天我没权利!!!
CEO:我是老板,我说了算!!!
CEO:申请通过!!!