八、责任链设计模式

1. 责任链模式介绍

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

考虑到如下情景:
小李要出差,出差之后,小李要报销经费,小李申请了50000块的经费。

  1. 首先向组长提出,组长,他只能报销2000元以内的。组长把小李的请求向主管提出。

  2. 主管收到申请后,主管说他也无法批准,他只能批准5000以内的,所以主管把请求又递交给了总经理。

  3. 总经理收到请求后,他只能批准10000以内的,所以主管把请求又递交给了老板。

  4. 老板收到请求后,把小李的请求给处理了。

以上请求就是一个责任链模式,发出请求者并不知道谁会来处理请求,每个领导会根据自己的职责范围,来判断是处理还是把请求递交给更高级别的领导。只要有领导处理了,传递就结束了。

2. 责任链模式使用场景

  • 多个对象可以处理同一请求,单具体由哪个对象处理则在运行时动态决定的。
  • 在请求矗立着不明确的情况下向多个对象中的一个提交一个请求。
  • 需要动态指定一组对象处理请求。

3. 责任链模式UML类图

责任链UML

4. 责任链模式简单实现

情景描述:介绍里面描述的申请经费案例。

包结构:

责任链模式包结构

(1) 首先声明一个抽象的老板类:

public abstract class Leader {
        protected Leader nextHandler;//上一级领导处理者

        public void handleRequest(int money) {
            if (money <= limit()) {
                handleMoney(money);
            } else {
                if (nextHandler != null) {
                    nextHandler.handleRequest(money);
                }
            }
        }

        //处理
        protected abstract void handleMoney(int money);

        //每一级领导能够批准的额度
        protected abstract int limit();
    }

在上述抽象类中,发起请求时,调用handleRequest()方法,步骤如下:

  1. 在handleRequest方法中,首先判断传递进来的money是否小于当前领导能够批准的额度。这个额度由 limit()这个方法返回,limit()是一个抽象方法,由具体的领导实现。

  2. 如果money小于当前领导所能处理的额度,调用handleMoney(money)方法,handleMOney(money)也是一个抽喜类,由具体的领导类实现。

  3. 如果money大于当前领导所能处理的额度,调用上一级领导的handleReqeust()方法。

  4. 重复以上1、2、3步骤,直到结束。

(2)具体的领导类:Boos,DirectorLeader,GroupLeader,ManagerLeader:

public class Boss extends Leader {
        @Override
        protected void handleMoney(int money) {
            System.out.println("老板报销: " + money);
        }

        @Override
        protected int limit() {
            return Integer.MAX_VALUE;
        }
}

(3)测试类:

public class Person {
        public static void main(String[] args) {
            //构造各个级别领导
            GroupLeader groupLeader = new GroupLeader();
            DirectorLeader directorLeader = new DirectorLeader();
            ManagerLeader managerLeader = new ManagerLeader();
            Boss boss = new Boss();

            //设置上一级领导处理对象
            groupLeader.nextHandler = directorLeader;
            directorLeader.nextHandler = managerLeader;
            managerLeader.nextHandler = boss;

            //申请报销
            groupLeader.handleRequest(50000);
        }
}
  • 对于责任链来说,一个请求最终只有两种情况:一是被某个处理对象处理,另一个是所有的对象均为对其处理。 对于前一种情况,我们称该对象为纯的责任链,对于后一种情况我们称为不纯的责任链,在实际应用中,我们所见的责任链模式大多为不纯的责任链模式。

5. 责任链模式在Android系统中

android触摸事件流程是一个典型的责任链模式,具体网上有很多优质的文章介绍,这里就不做赘述了。
这里推荐一篇个人决定不错的文章。

android触摸事件处理流程

6. 责任链模式在Android开发中

责任链模式可以替代各种分支和条件判断语句,这里就不做具体举例。

7. 总结

  • 优点:
    • 可以对请求者和处理者关系解耦,提高代码的灵活性。
  • 缺点:
    • 对链中请求处理的遍历,如果处理者太多,那么遍历必定会影响性能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值