八、责任链设计模式

来源:互联网 发布:java开发自我介绍范文 编辑:程序博客网 时间:2024/04/30 06:19

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
原创粉丝点击