java设计模式-行为型模式-责任链模式

责任链模式

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

两个角色

  • 请求者
  • 接收者

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

共有三级领导,一级领导处理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

总结

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

补充

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

回到主目录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值