责任链模式

责任链模式,发送者发送请求给接收者,接收者是一个链,一个接收者不满足条件的话,把请求转发给下一个请求者,接收者拥有下一个接收者的引用。

两个角色

  • 请求者
  • 接收者

例子:有一笔大额订单需要领导审批

共有三级领导,一级领导处理1万元以下的订单,二级领导处理1万-2万元的订单,三级领导处理2万以上的订单

  • 定义一个订单类(Order)
public class Order {

    private Integer amount;

    public Integer getAmount() {
        return amount;
    }

    public void setAmount(Integer amount) {
        this.amount = amount;
    }

    public Order(Integer amount) {
        this.amount = amount;
    }
}
  • 定义一个抽象角色类(AbstractRole)

这个抽象角色类中设置了下一个处理请求角色的引用,定义了处理请求的抽象方法

public abstract class AbstractRole {

    public static final Integer ORDER_AMOUNT_LEVEL_ONE = 10000;
    public static final Integer ORDER_AMOUNT_LEVEL_TWO = 20000;

    AbstractRole nextRole;

    public void setNextRole(AbstractRole nextRole) {
        this.nextRole = nextRole;
    }

    protected abstract void approve(Order order);
}
  • 定义三个级别的领导类
public class LeaderLevelOne extends AbstractRole {

    @Override
    protected void approve(Order order) {
        if (order.getAmount() < ORDER_AMOUNT_LEVEL_ONE) {
            System.out.println("我是一级领导,我来处理这批订单,订单金额是:" + order.getAmount());
        } else {
            System.out.println("我是一级领导,订单金额过大,交给上级领导处理");
            nextRole.approve(order);
        }
    }
}
public class LeaderLevelTwo extends AbstractRole {

    @Override
    protected void approve(Order order) {
        if (order.getAmount() < ORDER_AMOUNT_LEVEL_TWO) {
            System.out.println("我是二级领导,我来处理这批订单,订单金额是:" + order.getAmount());
        } else {
            System.out.println("我是二级领导,订单金额过大,交给上级领导处理");
            nextRole.approve(order);
        }
    }
}
public class LeaderLevelThree extends AbstractRole {

    @Override
    protected void approve(Order order) {
        System.out.println("我是三级领导,我来处理这批订单,订单金额是:" + order.getAmount());
    }
}
  • 模拟具体场景

设置一级领导的下一个处理角色为二级领导,二级领导的下一个处理角色为三级领导

public class Main {
    public static void main(String[] args) {
        Order order = new Order(28000);

        AbstractRole one = new LeaderLevelOne();
        AbstractRole two = new LeaderLevelTwo();
        AbstractRole three = new LeaderLevelThree();

        one.setNextRole(two);
        two.setNextRole(three);
        
        one.approve(order);
    }
}
  • 结果如下
我是一级领导,订单金额过大,交给上级领导处理
我是二级领导,订单金额过大,交给上级领导处理
我是三级领导,我来处理这批订单,订单金额是:28000

总结

优点:实现了请求者个接收者之间的解耦,请求者不需要知道具体接收者是谁
缺点:如果需要在两个现有角色之间增加新的角色,需要修改现有代码,不符合开闭原则

补充

上面的例子是单纯的责任链模式,还有不单纯的责任链模式,当前角色先处理了本次请求,再交给下一个角色继续处理。比如说订单需要多级领导都要审批通过,下一个领导在看到了上一个领导的审批后,才会签字审批。

回到主目录