责任链模式介绍
责任链模式指的是,在设计阶段将请求与处理进行分离,请求的处理被分为多个处理器,只有在运行阶段才能确定使用哪个处理器去处理请求。打个比方说,现在要跟公司请假,有些请假原因部门经理可以直接审批,但是有些请假原因必须要老板进行审批,这种情况就需要部门经理将请假请求转发给老板去处理,这种将请求进行传递的过程就形成了一条责任链。
如果要通过代码去实现责任链模式的请假审批功能,首先需要创建一个抽象的处理器类,包含用来存储具体实现类的属性,再创建两个具体的实现类,一个表示部门经理的处理方式,一个表示老板对请求的处理。
责任链模式示例代码
创建一个抽象的处理器类
/**
* 抽象处理器
*/
public abstract class HandlerAbstract {
//指向责任链中的下一个处理器
protected HandlerAbstract nextHandler;
public void setNextHandler(HandlerAbstract nextHandler) {
this.nextHandler = nextHandler;
}
/**
* 处理请假的抽象方法
* type='病假',部门经理直接审批,否则交给老板处理
*/
public abstract void handle(String type);
}
抽象处理器包含一个存储下一处理器的属性,如果当前处理器无法处理请求,转交给这个处理器去处理。handle()
是处理请求的具体方法,这里如果type==病假
,部门经理处理器可以直接处理,否则转交给Boss处理器。
创建两个具体的处理器类
/**
* 部门经理处理请假申请
*/
public class ManagerHandler extends HandlerAbstract{
@Override
public void handle(String type) {
if(type.equals("病假")) {
System.out.println("部门经理审批完成:同意");
}else {
System.out.println("部门经理没有权限,转交Boss处理");
this.nextHandler.handle(type);
}
}
}
/**
* Boss处理请假申请
*/
public class BossHandler extends HandlerAbstract {
@Override
public void handle(String type) {
System.out.println("Boss审批完成:同意");
}
}
具体的处理类,实现了handle()
方法,并且由于两个处理器得到职责不同,处理请求的方式也是不一样的。
创建客户端类,发起请假申请
public class test_01 {
public static void main(String[] args) throws InterruptedException {
HandlerAbstract manager = new ManagerHandler();
HandlerAbstract boss = new BossHandler();
manager.setNextHandler(boss);
manager.handle("其他");
}
}
测试类中,显示创建了表示部门经理的处理器,又创建了表示Boss的处理器,紧接着通过manager.setNextHandler(boss)
让部门经理处理器指向Boss处理器,当遇到部门经理无法处理的请求时,就可以直接转发给Boss处理器了,最后调用处理器的处理方法,运行结果如下:
可以看到,当请求到达部门经理时,由于请假的类型不是病假,所以部门经理没有审批权限只能交给Boss去处理,最终Boss处理器批准了请假申请。
总结
当一个请求的处理方式需要在运行时才能确定,就可以选用责任链模式。这种设计模式中的对象结构是链式的,如果需要新增或删除处理器,会非常容易,保证了灵活性和扩展性,并且在调用请求的时候,不会知道请求最终被哪个处理器处理,所以降低了客户端和处理器之间的耦合度。