责任链模式的定义

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

模型:

  • Hander:抽象处理者
  • ConcreteHander:具体处理者

下面模型代码如下:

1.设计等级类


public class Level {private  int level=1;public  Level(int level){this.level=level;}public int getLevel() {return level;}
}

2.请求类


public class MyRequest {Level level;public  MyRequest(Level level){this.level=level;}public int  getLevel(){return level.getLevel();}}

3.响应类


public class Response {private String message;public Response(String message) {Log.d("qzs","处理完成");this.message = message;}public String getMessage() {return message;}
}

4.抽象处理者类


public abstract class AbstractHandler  {//判断下一个处理者是谁private AbstractHandler nextHandler = null;public final Response handlerRequest(MyRequest request) {Response response = null;if(this.getHandlerLevel()==request.getLevel()) {response = this.response(request);}else {if(this.nextHandler != null) {Log.d("qzs","转到下一个处理者中...");response = this.nextHandler.handlerRequest(request);}else {Log.d("qzs","后面没有处理请求了...");}}return response;}public void setNextHandler(AbstractHandler handler) {nextHandler = handler;}//拿到等级protected abstract int getHandlerLevel();//响应protected abstract Response response(MyRequest request);
}

5.定义具体的处理者,这里就定义了两个:


public class ConcreteHandlerA extends AbstractHandler {@Overrideprotected int getHandlerLevel() {return 0;}@Overrideprotected Response response(MyRequest request) {Log.d("qzs","正在处理中“ConcreteHandlerA");return new Response("响应处理结果A") ;}
}public class ConcreteHandlerB extends AbstractHandler {@Overrideprotected int getHandlerLevel() {return 1;}@Overrideprotected Response response(MyRequest request) {Log.d("qzs","正在处理中“ConcreteHandlerB");return new Response("响应处理结果B") ;}
}

6.调用:

前提是A到B组成了一个链,并且上面A的等级是0,B是1;发出的请求先经过A如果不能处理就交给B:

AbstractHandler handler1=new ConcreteHandlerA();AbstractHandler handler2=new ConcreteHandlerB();//A到B组成一个链handler1.setNextHandler(handler2);Response response=handler1.handlerRequest(new MyRequest(new Level(1)));

上面代码我传送的等级是1,结果应该是由B解决的,下面是运行结果:

如果你传入的等级不在A和B的范围,运行结果如下:

说明没有适合的了。


实例说明

如果上面的定义不是很明白,下面直接实例说明一下。

例子:家里的小孩想出去玩,需要请示一下,这里规定一级请示爸爸,爸爸同意了就可以出去玩了;如果爸爸不在家就请示(二级)妈妈,妈妈同意了也可以出去玩;如果都不在家就不允许出去玩。

1.编写等级类,响应类,请求类,这些都没有变化可以直接去上面看就可以了。

2.抽象处理类:


public abstract class AbstractHandler  {//判断下一个处理者是谁private AbstractHandler nextHandler = null;public final Response handlerRequest(MyRequest request) {Response response = null;if(this.getHandlerLevel()==request.getLevel()) {response = this.response(request);}else {if(this.nextHandler != null) {Log.d("qzs","转到下一个处理者中...");response = this.nextHandler.handlerRequest(request);}else {Log.d("qzs","爸爸妈妈不在家...");}}return response;}public void setNextHandler(AbstractHandler handler) {nextHandler = handler;}//拿到等级protected abstract int getHandlerLevel();//响应protected abstract Response response(MyRequest request);
}

3.具体处理者,也就是爸爸和妈妈:


public class Father extends AbstractHandler {@Overrideprotected int getHandlerLevel() {return 1;}@Overrideprotected Response response(MyRequest request) {Log.d("qzs","正在处理中“Father”");Log.d("qzs","爸爸同意孩子出去玩了");return  new Response("") ;}
}public class Mother extends  AbstractHandler{@Overrideprotected int getHandlerLevel() {return 2;}@Overrideprotected Response response(MyRequest request) {Log.d("qzs","正在处理中“Mother”");Log.d("qzs","妈妈同意孩子出去玩了");return new Response("") ;}
}

4.调用

如果传入的等级1:

AbstractHandler handler1=new Father();AbstractHandler handler2=new Mother();//先问爸爸,爸爸不在家再问妈妈handler1.setNextHandler(handler2);Response response=handler1.handlerRequest(new MyRequest(new Level(1)));

运行结果:

传入其他的等级也可以,这个大家可以自己去试一试。

责任链模式的优缺点及其他

1.优点

  • 耦合度降低,请求和处理是分开的

2.缺点

  • 责任链太长或者每条链判断处理的时间太长会影响性能。特别是递归循环的时候
  • 不一定被处理,每个职责类的职责很明确,这就需要对写默认的处理了

责任链模式重要的两点:分离职责,动态组合

本文部分定义参考了网上博文和网上信息...


另外可以加入我的Android技术交流群:458739310
大家可以关注我的微信公众号:「安卓干货铺」一个有质量、有态度的公众号!

设计模式(9)-责任链模式详解(易懂)相关推荐

  1. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  2. Java设计模式之责任链模式(简单易懂)

    前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...

  3. java设计模式---责任链模式详解

    深入理解什么是责任链模式 一,责任链模式 1,什么是责任链模式 二,框架中使用到的责任链模式 1,springmvc流程 2,mybatis的执行流程 3,spring的过滤器和拦截器 4,senti ...

  4. java责任链模式_java中责任链模式详解和使用方法

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为 ...

  5. 23种设计模式之——责任链模式(okhttp 拦截器)

    前言 网络七层协议 在现实中的责任链模型之一就是网络连接.对与程序猿而言,七层或五层的网络连接模型是肯定知道的. 当一个网络请求发出时,需要经过应用层->传输层->网络层->连接层- ...

  6. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  7. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...

  8. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  9. 轻松学习Java设计模式之责任链模式

    我们的态度是:每天进步一点点,理想终会被实现. 前言 设计模式,可能很多人都是看到代码知道怎么回事,但是离开代码再让其说出来,估计就有点含糊其词了,包括我自己在内.Android中其实用到的设计模式也 ...

最新文章

  1. 阿里云Windows服务器重启后无法远程桌面连接,大量注册表在检测
  2. seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  3. 【Flask】Request和RequestParser类
  4. 【行业进展】哪些公司在搞“新零售”了
  5. 与虫子尾交3d动画网站_不容错过的三维动画设计展!快来pick吧!
  6. 万字长文|深入理解XDP全景指南
  7. Online DDL
  8. Linux学习之服务器搭建——DHCP服务器
  9. html4中basefont,html basefont标签怎么用
  10. 页面跨域与iframe通信(Blocked a frame with origin)
  11. 服务器端修改yapi-cli默认IP,centos部署yapi
  12. “我辞退了一位学位学历造假的程序员“
  13. CSS+DIV:理论实战缺一不可
  14. Uva 140 Bandwidth
  15. 漫画:女生/男生告白攻略
  16. 显示器色域检测软件_摄影师:手机看图的甲方爸爸值得我换专业摄影显示器吗?...
  17. 海康摄像机取流RTSP地址规则说明
  18. html鼠标滑动响应,CSS鼠标响应事件经过、移动、点击示例介绍
  19. [后端开发]支付宝支付接口调试 (Python v3.6)
  20. 微信公众平台接口程序语音天气

热门文章

  1. SAP MM 如何手工修改IDoc的状态?
  2. 快手刘霁:AI基础能力决定每个公司AI的迭代和落地效率丨MEET2020
  3. AI初创企业“考拉悠然”获3000万融资
  4. 经验 | 初入NLP领域的一些小建议
  5. 技术新进展!谷歌AI部门宣布发现新技术以加速AI神经网络训练
  6. 人工智能基础-向量的基本几何意义
  7. SAP HUMO VLMOVE不支持E库存发货到成本中心
  8. 【美国斯坦福大学人工智能研究院:人工智能当以人为本】
  9. 深度学习框架的内存优化机制
  10. 【十大经典数据挖掘算法】k-means