责任链模式——请让处理者与请求者解耦
2016-11-13 16:04
369 查看
android中的责任链模式
对于Android中,有一个非常形象的例子可以说明这种设计模式——有序广播。当一个有序广播发出后,需要优先级为200的广播接受者进行处理,因为是有序广播,所以要先发送给优先级为1000的广播接受者,发现其优先级为不是200,在继续往下发送,比如说发送给优先级为800的广播接受者,一次类推,当发送给优先级为200的目标广播接受者的时候,处理事件,并终止广播。不难看出来,责任链模式有一个特点,必须从优先级1000的开始发送,即必须从开始依次遍历,当遍历到目标处理时终止。还有一个十分明显的例子——屏幕点击事件处理。当view的ontouch返回为true的时候则终止传递,返回为false的时候继续往下层传递。
角色构成:
Handler:抽象的处理者角色。ConcreateHandler:具体的处理者角色
Request:请求者抽象角色。
ConcreateRequest:具体请求者角色。
demo:
Handlerpublic 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); }
相关文章推荐
- 19、命令模式—为请求者和实现者解耦
- spring 事件:实现业务逻辑解耦
- 设计模式之责任链模式
- JS设计模式之责任链模式实例详解
- 责任链模式
- Python 责任链模式实现
- JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。
- Groovy 设计模式 -- 责任链模式
- httpclient获取响应实体和信息的封装方法(解耦更新)
- 责任链模式
- 使用门面模式进一步地解耦Spring与Struts的整合
- [创建型模式系列]Chain of Responsibility Pattern 责任链模式
- 设计模式--责任链模式(COR)
- SWT MAC 安装事件处理者
- 解耦配置文件依赖,让单元测试跑起来
- [EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity?
- 用 python-message 为程序库和日志模块解耦
- HeadFirst 设计模式学习笔记15--责任链模式拾零
- 极速理解设计模式系列:12.责任链模式(Chain of Responsibility Pattern)