您的位置:首页 > 其它

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

2016-11-13 16:04 369 查看

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  责任链模式