Android编程设计模式之责任链模式详解

本文实例讲述了Android编程设计模式之责任链模式。分享给大家供大家参考,具体如下:

一、介绍

责任链模式(Iterator Pattern),是行为型设计模式之一。什么是”链“?我们将多个节点首尾相连所构成的模型称为链,比如生活中常见的锁链,就是由一个个圆角长方形的铁环串起来的结构。对于链式结构,每个节点都可以被拆开再连接,因此,链式结构也具有很好的灵活性。将这样一种结构应用于编程领域,将每一个节点看作是一个对象,每一个对象拥有不同的处理逻辑,将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,我们将这样的一种模式称为责任链模式,这样的解释是不是更通俗易懂呢?我们还是看看责任链模式的标准定义。

二、定义

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

三、使用场景

多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。

在请求处理者不明确的情况下向多个对象中的一个提交一个请求。

需要动态指定一组对象处理请求。

四、责任链模式的UML类图

UML类图:

角色介绍:

Handler:抽象处理者角色,声明一个请求处理的方法,并在其中保持一个对下一个处理节点Handler对象的引用。

ConcreteHandler:具体处理者角色,对请求进行处理,如果不能处理则将该请求转发给下一个节点上的处理对象。

五、简单实现

这个例子我觉得很贴切。我们在公司有各种原因需要报销费用,首先我们要找我们的上级领导去审批,报销额度如果在领导的权限范围内,那就审批通过,否则领导在找自己的上级去审批,以此类推。

抽象领导类:

public abstract class Leader {
  /**
   * 上级领导处理者
   */
  protected Leader nextHandler;
  /**
   * 处理报账请求
   *
   * @param money 能批复的报账额度
   *
   */
  public final void handleRequest(int money){
    System.out.println(getLeader());
    if(money <=limit()){
      handle(money);
    }else{
      System.out.println("报账额度不足,提交领导");
      if(null != nextHandler){
        nextHandler.handleRequest(money);
      }
    }
  }
  /**
   * 自身能批复的额度权限
   *
   * @return 额度
   */
  public abstract int limit();
  /**
   * 处理报账行为
   *
   * @param money 具体金额
   */
  public abstract void handle(int money);
  /**
   * 获取处理者
   *
   * @return 处理者
   */
  public abstract String getLeader();
}

在这个抽象的领导类中只做了两件事,一是定义了两个抽象接口方法来确定一个领导者应有的行为和属性,二是声明了一个处理报账请求的方法来确定当前领导是否有能力处理报账请求,如果没有这个权限,则将该请求转发给上级领导处理。接下来则是各个领导类的实现:

组长(额度1000):

public class GroupLeader extends Leader{
  @Override
  public int limit() {
    return 1000;
  }
  @Override
  public void handle(int money) {
    System.out.println("组长批复报销"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "当前是组长";
  }
}

主管(额度5000):

public class Director extends Leader{
  @Override
  public int limit() {
    return 5000;
  }
  @Override
  public void handle(int money) {
    System.out.println("主管批复报销"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "当前是主管";
  }
}

经理(额度10000):

public class Manager extends Leader{
  @Override
  public int limit() {
    return 10000;
  }
  @Override
  public void handle(int money) {
    System.out.println("经理批复报销"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "当前是经理";
  }
}

老板(额度…):

public class Boss extends Leader{
  @Override
  public int limit() {
    return Integer.MAX_VALUE;
  }
  @Override
  public void handle(int money) {
    System.out.println("老板批复报销"+ money +"元");
  }
  @Override
  public String getLeader() {
    return "当前是老板";
  }
}

发起申请:

public class Client {
  public static void main(String[] args) {
    //构造各个领导对象
    GroupLeader groupLeader = new GroupLeader();
    Director director = new Director();
    Manager manager = new Manager();
    Boss boss = new Boss();
    //设置上级领导处理者对象
    groupLeader.nextHandler = director;
    director.nextHandler = manager;
    manager.nextHandler = boss;
    //发起报账申请
    groupLeader.handleRequest(8000);
  }
}

结果:

当前是组长
报账额度不足,提交领导
当前是主管
报账额度不足,提交领导
当前是经理
经理批复报销8000元

责任链模式非常灵活,请求的发起可以从责任链的任何一个节点开始,也可以改变内部的传递规则。比如主管不在,我们完全可以跨过主管直接从组长那里转到经理。

对于责任链中的一个处理者对象,有两个行为。一是处理请求,二是将请求传递到下一节点,不允许某个处理者对象在处理了请求后又将请求传送给上一个节点的情况。

对于一条责任链来说,一个请求最终只有两种情况。一是被某个处理对象所处理,另一个是所有对象均未对其处理,对于前一种情况我们称为纯的责任链模式,后一种为不纯的责任链。实际中大多为不纯的责任链。

六、Android源码中的责任链模式

1、View事件的分发处理

ViewGroup事件投递的递归调用就类似于一条责任链,一旦其寻找到责任者,那么将由责任者持有并消费掉该次事件,具体体现在View的onTouchEvent方法中返回值的设置,如果返回false,那么意味着当前的View不会是该次的责任人,将不会对其持有;如果返回true,此时View会持有该事件并不再向外传递。

七、总结

优点:

可以对请求者和处理者的关系解耦,提高代码的灵活性。

缺点:

每次都需要对链中请求处理者遍历,如果处理者太多那么遍历必定会影响性能,特别是在一些递归调用者中,要慎用。

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android编程设计模式之状态模式详解

    本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们的目的.本质却完全不一样.状态模式的行为是平行的.不可替换的,策略模式的行为是彼此独立.可相互替换的.用一句话来表述,状态模式把对象的行为包装在不同的状态对象里,每一个状态对象都有一个共同的抽象状态基类.状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变. 二.定义 当一个对象的内在

  • Android编程设计模式之迭代器模式详解

    本文实例讲述了Android编程设计模式之迭代器模式.分享给大家供大家参考,具体如下: 一.介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一.迭代器模式算是一个比较古老的设计模式,其源于对容器的访问,比如Java中的List.Map.数组等,我们知道对容器对象的访问必然会涉及遍历算法,我们可以将遍历的方法封装在容器中,或者不提供遍历方法.如果我们将遍历的方法封装到容器中,那么对于容器类来说就承担了过多的功能,容器类不仅要维护自身内部的数据元

  • Android编程设计模式之策略模式详解

    本文实例讲述了Android编程设计模式之策略模式.分享给大家供大家参考,具体如下: 一.介绍 在软件开发中也常常遇到这样的情况:实现某一个功能可以有多种算法或者策略,我们根据实际情况选择不同的算法或者策略来完成该功能.例如,排序算法,可以使用插入排序.归并排序.冒泡排序等. 针对这种情况,一种常规的方法是将多种算法写在一个类中.例如,需要提供多种排序算法,可以将这些算法写到一个类中,每一个方法对应一个具体的排序算法:当然,也可以将这些排序算法封装在一个统一的方法中,通过if-else-或者ca

  • Android编程设计模式之抽象工厂模式详解

    本文实例讲述了Android编程设计模式之抽象工厂模式.分享给大家供大家参考,具体如下: 一.介绍 抽象工厂模式(Abstract Factory Pattern),也是创建型设计模式之一.前一节我们已经了解了工厂方法模式,那么这个抽象工厂又是怎么一回事呢?大家联想一下现实生活中的工厂肯定都是具体的,也就是说每个工厂都会生产某一种具体的产品,那么抽象工厂意味着生产出来的产品是不确定的,那这岂不是很奇怪?抽象工厂模式起源于以前对不同操作系统的图形化解决方案,如不同操作系统中的按钮和文本框控件其实现

  • Android编程设计模式之模板方法模式详解

    本文实例讲述了Android编程设计模式之模板方法模式.分享给大家供大家参考,具体如下: 一.介绍 在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,但是,某些步骤的具体实现是未知的,或者说某些步骤的实现是会随着环境的变化而改变的,例如,执行程序的流程大致如下: 1.检查代码的正确性: 2.链接相关的类库: 3.编译相关代码: 4.执行程序. 对于不同的程序设计语言,上述4个步骤都是不一样的,但是,它们的执行流程是固定的,这类问题的解决方

  • Android编程设计模式之解释器模式详解

    本文实例讲述了Android编程设计模式之解释器模式.分享给大家供大家参考,具体如下: 一.介绍 解释器模式(Interpreter Pattern)是一种用的比较少的行为型模式,其提供了一种解释语言的语法或表达式的方式,该模式定义了一个表达式接口,通过该接口解释一个特定的上下文.在这么多的设计模式中,解释器模式在实际运用上相对来说要少很多,因为我们很少会自己去构造一个语言的文法.虽然如此,既然它能够在设计模式中有一席之位,那么必定有它的可用之处. 二.定义 给定一个语言,定义它的文法的一种表示

  • Android编程设计模式之访问者模式详解

    本文实例讲述了Android编程设计模式之访问者模式.分享给大家供大家参考,具体如下: 一.介绍 访问者模式是一种将数据操作与数据结构分离的设计模式,它是<设计模式>中23种设计模式中最复杂的一个,但它的使用频率并不高,正如<设计模式>的作者GOF对访问者模式的描述:大多数情况下,你不需要使用访问者模式,但是当你一旦需要使用它时,那你就是真的需要它了. 访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的.比较稳定的对象结构,这些对象的类都拥有一个accept方法用来接受访问

  • Android编程设计模式之中介者模式详解

    本文实例讲述了Android编程设计模式之中介者模式.分享给大家供大家参考,具体如下: 一.介绍 中介者模式(Mediator Pattern)也称为调解者模式或调停者模式,Mediator本身就有调停者和调解者的意思. 在日常生活中调停者或调解者这个角色我们见得比较多的是"和事老",也就是说调解两个有争端的人的角色,举个不恰当的例子,比如爸妈吵架,孩子或者双方父母则会出面劝架或阻止争吵,这里孩子或双方父母则是充当的是调解者的模式. 而对于中介呢?大家平时听得最多的莫过于房产中介了,在

  • android设计模式之单例模式详解

    这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程. 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程. 隐藏创建方式,就是如单例,工厂方法,隐藏创建过程则是指builder,原型,至于抽象工厂,我认为他包含了以上两种. 我们想想一个对象的创建有哪些步骤? 1.创建什么东西?--接口定义 2.谁创建?        --决策类or帮助类 3.如何创建?     --how,创建过程 4.什么时候创建?    --创建时机的触发 由此可知,

  • Android编程设计模式之命令模式详解

    本文实例讲述了Android编程设计模式之命令模式.分享给大家供大家参考,具体如下: 一.介绍 命令模式(Command Pattern),是行为型设计模式之一.命令模式相对于其他的设计模式来说并没有那么多的条条框框,其实它不是一个很"规范"的模式,不过,就是基于这一点,命令模式相对于其他的设计模式更为灵活多变.我们接触比较多的命令模式个例无非就是程序菜单命令,如在操作系统中,我们点击"关机"命令,系统就会执行一系列的操作,如先是暂停处理事件,保存系统的一些配置,然

  • Android编程设计模式之备忘录模式详解

    本文实例讲述了Android编程设计模式之备忘录模式.分享给大家供大家参考,具体如下: 一.介绍 备忘录模式是一种行为模式,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态,这有点像我们平时说的"后悔药".备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护好被保存的这些对象状态的完整性以及内部实现不向外暴露. 二.定义 在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后就可将该对象恢复到原先保存的状态. 三.使用

随机推荐