(行为型模式)责任链模式

63 阅读1分钟

简介

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。

案例

张三向公司申请请假审批,每个领导的权限不一样可审批的请假天数也不同。这就存在着一整个链条关系,组长->经理->老板。

抽象处理器

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);
    }
}

结果

D2A39NyL0D.jpg

优缺点

优点

  • 降低耦合度,代码结构变得清晰干净。
  • 灵活度高,可动态添加责任对象、删除责任对象、改变责任对象顺序。

缺点

  • 类变多增加系统复杂多。
  • 链路组合不当可能出现循环调用或者某一方不能正确调用。