责任链模式——《Android源码设计模式解析与实践》读书笔记9

定义

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


使用场景

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

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

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


UML类图

简化模式:

简化责任链模式,多角色

通用模式:

通用责任链模式,多角色

关键点

(1)请求的发起可以从责任链的任何一个节点开始。

(2)责任链中的任意一个处理者对象都只有两个行为,一是处理请求,二是将请求转送给下一个节点。

(3)处理者处理请求后不允许转送到其他节点进行处理。

(4)纯的责任链指请求被责任链中某个处理对象处理的责任链,不纯的责任链指所有处理者对象都没处理请求的责任链。


实现方式

简化模式

Handler基类:

public abstract class Handler{

    protected Handler successor;

    public abstract void handleRequest(string condition);

}

Handler子类1:

public Handler1 extends Handler{

    @Override

    public void handleRequest(String condition){

        if (null != condition && condition.equals("condition1")){

            return;

        } else {

            successor.handleRequest(condition);

        }

    }

}

Handler子类2:

public Handler2 extends Handler{

    @Override

    public void handleRequest(String condition){

        if (null != condition && condition.equals("condition2")){

            return;

        }else {

            successor.handleRequest(condition);

        }

    }

}

调用例子

public class Test{

    public static void main(string [] args){

        Handler1 mHandler1 = new Handler1();

        Handler2 mHandler2 = new Handler2();

        mHandler1.successor= mHandler2;

        mHandler2.successor= mHandler1;

        mHandler2.handleRequest("condition2");

    }

}

通用模式

在简化模式的基础上:

(1)Handler子类中添加一个获取处理请求类型(通常表现为权限等级)的方法

(2)对请求进行封装,形成抽象类Request以及其对应子类,每个类中含处理体及其getter、setter方法,以及获取请求类型(通常表现为权限等级)的方法

即可构成通用模式的责任链模式模型代码。


责任链模式的优缺点

优点

>请求者和处理者解耦,代码灵活性得到提高

缺点

>请求链中对处理者遍历可能太长,特别是递归调用,会影响性能


Android中的责任链模型举例

ViewTree自上而下分发事件的机制,即View的事件分发模型


——2017.08.14

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容