简介
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
案例
张三向公司申请请假审批,每个领导的权限不一样可审批的请假天数也不同。这就存在着一整个链条关系,组长->经理->老板。
抽象处理器
public abstract class AbstractHandler {
/**
* 责任链中下一个元素
*/
protected AbstractHandler nextHandler;
public void setNextLogger(AbstractHandler nextLogger) {
this.nextHandler = nextLogger;
}
abstract protected void handler(Integer day);
}
处理器中的nextHandler就是这个链条能连接起来的节点。
组长处理器
public class GroupLeader extends AbstractHandler {
@Override
protected void handler(Integer day) {
if(day<5){
System.out.println("审批通过");
} else {
System.out.println("超出权限范围,向上级申请");
nextHandler.handler(day);
}
}
}
经理处理器
public class Manager extends AbstractHandler {
@Override
protected void handler(Integer day) {
if(day<14){
System.out.println("审批通过");
} else {
System.out.println("超出权限范围,向上级申请");
nextHandler.handler(day);
}
}
}
老板处理器
public class Boss extends AbstractHandler {
@Override
protected void handler(Integer day) {
if(day<30){
System.out.println("审批通过");
} else {
System.out.println("左转去财务结算工资");
}
}
}
使用
public class Demo {
public static void main(String[] args) {
AbstractHandler groupLeader = new GroupLeader();
AbstractHandler manager = new Manager();
AbstractHandler boss = new Boss();
groupLeader.setNextLogger(manager);
manager.setNextLogger(boss);
System.out.println("张三发起请假申请");
groupLeader.handler(30);
}
}
结果
优缺点
优点
- 降低耦合度,代码结构变得清晰干净。
- 灵活度高,可动态添加责任对象、删除责任对象、改变责任对象顺序。
缺点
- 类变多增加系统复杂多。
- 链路组合不当可能出现循环调用或者某一方不能正确调用。