《Android源码设计模式》读书笔记 (9) 第9章 责任链模式

前言

  • 该模式是行为设计模式之一.如果说android中该模式应用最具代表性的例子的话就是android的触摸机制.大家此时可以想想android的点击事件传递和拦截机制那幅图,就能更好的理解这个模式啦.如果想不起来也没关系,这里贴出来这个图.(以前自己画的,有点丑,大家也可以自行百度哈,不影响理解(^__^) ).
    这里写图片描述

定义

  • 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系.将这些对象连成一个链,并沿着这条链传递该请求.只到有对象处理它为止.
  • 使用场景:
    1.多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定.
    2.在请求处理不明确的情况下向多个对象中的一个提交一个请求.
    3.需要动态指定一组对象处理请求.
  • 优点:可以对请求者和处理者关系解耦,提高代码的灵活性.
  • 缺点:对链中处理者的遍历,如果处理者太多那么遍历必定会影响性能,特别是在一些递归调用中,需要慎重
  • -

UML类图

  • 简单责任链模式:请求相对单一

这里写图片描述

  • 复杂责任链模式:请求和对应的处理规则不尽相同
  • 这里未找到UML类图,见书上P167,其实也就是把请求和处理规则分别进行封装

实现步骤

  • 简单的责任链模式的实现:
  • Handler:抽象处理者
/**
 * 抽象处理者
 * @author max
 *
 */
public abstract class Handler {
    public Handler successor;//下一个节点处理者

    public abstract void handleRequest(String condition);
}
  • concreteHandler:具体处理者角色
/**
 * 具体的处理者1
 * 不是就继续传递
 * @author max
 *  */
public class ConcreteHandler1 extends Handler {

    @Override
    public void handleRequest(String condition) {
        if (condition.equals("1")) {
            System.out.println("处理1");
        }else{
            successor.handleRequest(condition);//否则就继续发送
        }
    }
}
  • 当然以上只是简单的实现了责任链模式的思路,但是在具体场景中,往往请求和相应的处理规则都不是这么简单.那么下面就是复杂一些的责任链模式的实现.
  • 这里就显示请求和处理规则的封装代码,具体实现请看模拟公司报账传递的demo吧

  • AbstractHandler:抽象处理者

/**
 * 抽象处理者
 * @author max
 *
 */
public abstract class AbstractHandler {
    public AbstractHandler nextHandler; //下一个节点的处理者

    //处理请求
    public final void  handleRequest(AbstractReuqest reuqest){
        if (getHandleLevel() == reuqest.getReqsuetLevel()) {//处理级别一致就处理
            handle(reuqest);
        }else{
            //否则就传递给下一个处理者
            if (null != nextHandler) {
                nextHandler.handleRequest(reuqest);
            }else{
                //当所有处理者对象均不能处理该请求时输出
                System.out.println("都处理不了");
            }
        }
    }

    //获取处理者对象的处理级别
    public abstract int getHandleLevel();

    //每个处理对象的具体处理方式
    public abstract void handle(AbstractReuqest reuqest);
}
  • AbstractReuqest:抽象请求者
/**
 * 抽象请求者
 * @author max
 *
 */
public abstract class AbstractReuqest {
    private Object object;//处理对象

    public AbstractReuqest(Object object) {
        this.object = object;
    }

    //获取处理的内容对象
    public Object getObject() {
        return object;
    }

    //获取请求级别
    public abstract int getReqsuetLevel();

}

源码下载

这里写图片描述
这里是demo目录.模块分别是调用实现;复杂模式请求和处理规则的封装;模拟公司报账传递的demo;简单模式原理;

点击下载源码http://download.csdn.net/detail/qq_28690547/9437976

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值