责任链模式——请让处理者与请求者解耦

android中的责任链模式

对于Android中,有一个非常形象的例子可以说明这种设计模式——有序广播。当一个有序广播发出后,需要优先级为200的广播接受者进行处理,因为是有序广播,所以要先发送给优先级为1000的广播接受者,发现其优先级为不是200,在继续往下发送,比如说发送给优先级为800的广播接受者,一次类推,当发送给优先级为200的目标广播接受者的时候,处理事件,并终止广播。不难看出来,责任链模式有一个特点,必须从优先级1000的开始发送,即必须从开始依次遍历,当遍历到目标处理时终止。

还有一个十分明显的例子——屏幕点击事件处理。当view的ontouch返回为true的时候则终止传递,返回为false的时候继续往下层传递。

角色构成:

Handler:抽象的处理者角色。
ConcreateHandler:具体的处理者角色
Request:请求者抽象角色。
ConcreateRequest:具体请求者角色。

demo:

Handler

public abstract class AbsHandler {
    public AbsHandler mHandler;

    /**
     * final方法不能被重写
     * @param request
     */
    public final void handleRequest(AbsRequest request){
        if(getHandlerLevel()==request.getRequestLevel()){
            handle(request);
        }else{
            if(mHandler!=null){
                mHandler.handleRequest(request);
            }
        }

    }

    protected abstract void handle(AbsRequest request);

    protected abstract int getHandlerLevel();

}

ConcreateHandler

public class Handler1 extends AbsHandler {
    @Override
    protected void handle(AbsRequest request) {
        Log.e("handler1","处理了");
    }

    @Override
    protected int getHandlerLevel() {
        return 1;
    }
}

public class Handler2 extends AbsHandler {
    @Override
    protected void handle(AbsRequest request) {
        Log.e("handler2","2处理了");
    }

    @Override
    protected int getHandlerLevel() {
        return 2;
    }
}

Request

public abstract class AbsRequest {

    private Object obj;

    public AbsRequest(Object obj) {
        this.obj = obj;
    }

    public Object getObj() {
        return obj;
    }

    protected abstract int getRequestLevel();
}

ConcreateRequest

public class Request1 extends AbsRequest {
    public Request1(Object obj) {
        super(obj);
    }

    @Override
    protected int getRequestLevel() {
        return 1;
    }
}
public class Request2 extends AbsRequest {
    public Request2(Object obj) {
        super(obj);
    }

    @Override
    protected int getRequestLevel() {
        return 2;
    }
}

Client调用

/**
     * 责任链模式测试:请求与处理者解耦,提高了代码的灵活性,但是责任链模式需要对请求处理者进行比遍历,如果处理者太多,遍历肯定会影响性能,特别是在递归调用中,要谨慎使用。
     */
    public void testChain() {
        AbsHandler handler1 = new Handler1();
        AbsHandler handler2 = new Handler2();

        AbsRequest request1 = new Request1("request1");
        AbsRequest request2 = new Request2("request2");

        handler1.mHandler = handler2;
        //总是从首端发起请求的
        handler1.handleRequest(request1);
        handler1.handleRequest(request2);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值