Coin163

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

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

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1074

【阿里云】双十一活动,全年抄底价,限时3天!(老用户也有),
入口地址https://www.aliyun.com/1111/home

相关推荐:《Android源码设计模式》读书笔记 (6) 第6章 抽象工厂模式

前言 相比于工厂模式,工厂模式是生产不同的复杂的具体的产品对象,而抽象工厂模式呢,抽象工厂生产出抽象产品,抽象产品通过不同组合返回不同具体的产品的对象.说起来有点抽象,我们看下UML图,在看下具体的代码可能你就清楚了 定义 定义:为一组相关或者相互依赖的

前言

  • 该模式是行为设计模式之一.如果说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吧

    相关推荐:《Android源码设计模式》读书笔记 (5) 第5章 工厂模式

    前言 定义 定义:定义一个用户创建对象的接口,让子类决定实例化哪个类 使用场景:需要生成复杂对象的地方,使用该模式,如果用new的对象,就无需使用.例如:activity生命周期,onCreate()等 缺点:每次为工厂方法模式添加新的产品时,就要编写一个新的产品类,同时还要

  • 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

原文

前言 该模式是行为设计模式之一.如果说android中该模式应用最具代表性的例子的话就是android的触摸机制.大家此时可以想想android的点击事件传递和拦截机制那幅图,就能更好的理解这个模式啦.如果

------分隔线----------------------------