说到责任链模式,几年前有一次面试经历,面试官拿着两页程序来考我设计模式,其实就是责任链模式,今天就来总结下这个模式
其实责任链模式的好处就是让我们省略了很多if/else或者switch语句,多个对象都有机会处理,从而避免了请求的发送者和接受者之间的耦合,形成一个链,沿着这个链传递,知道有一个对象处理为止。
角色:
1 抽象处理者(Handler)角色,定义一个处理请求的接口,定义两个方法,分别设定和返回下家的引用。
2 具体处理者:接到请求后,可以根据条件选择自己处理,或者传递给下家处理
例子:
我们在平时的工作中经常遇到请假的情况,如果是1天假,部门经理就有权利批准,如果是大于1天小于3天的假,部门总监可以批准,如果是3天以上的假,必须找总经理批准
/*
* 抽象处理者角色类
*/
public abstract class Handler {
protected Handler nextHandler = null;
public Handler getNextHandler(){
return nextHandler;
}
public void setNextHandler(Handler nextHandler){
this.nextHandler = nextHandler;
}
public abstract String handlerRequest(int days);
}
/*
* 部门经理
*/
public class DepartMentManager extends Handler{
@Override
public String handlerRequest(int days) {
// TODO Auto-generated method stub
String result = null;
if(days==1)
{
result = "你的请假天数是1天,部门经理已经批准!";
}else{
if(getNextHandler()!=null){
return getNextHandler().handlerRequest(days);
}
}
return result;
}
}
/*
* 部门总监
*/
public class DepartMentDirector extends Handler{
@Override
public String handlerRequest(int days) {
// TODO Auto-generated method stub
String result = null;
if(days < 3)
{
result = "你的请假天数是" + days + ",部门总监已经批准!";
}else{
if(getNextHandler()!=null){
return getNextHandler().handlerRequest(days);
}
}
return result;
}
}
/*
* 总经理
*/
public class TopManager extends Handler{
@Override
public String handlerRequest(int days) {
// TODO Auto-generated method stub
String result = null;
if(days >= 3)
{
result = "你的请假天数是" + days + ",总经理已经批准!";
}
return result;
}
}
public class MainClient {
public static void main(String[] args){
Handler h1 = new DepartMentManager();
Handler h2 = new DepartMentDirector();
Handler h3 = new TopManager();
h1.setNextHandler(h2);
h2.setNextHandler(h3);
System.out.println("我想请1天假");
String result = h1.handlerRequest(1);
System.out.println(result);
System.out.println("我想请2天假");
String result1 = h1.handlerRequest(2);
System.out.println(result1);
System.out.println("我想请4天假");
String result3 = h1.handlerRequest(4);
System.out.println(result3);
}
}
运行结果:
我想请1天假
你的请假天数是1天,部门经理已经批准!
我想请2天假
你的请假天数是2,部门总监已经批准!
我想请4天假
你的请假天数是4,总经理已经批准!
好了,责任链就这么简单,如有问题,欢迎指正,谢谢。