中国古代对妇女制定了“三从四德”的道德规范,“三从”是指未嫁从父,既嫁从夫,夫死从子。也就是说一位女性在结婚之前要听从父亲,结婚后要听从于丈夫,如果丈夫死了还要听从于儿子。比如要逛街,作为父亲,丈夫或儿子,只有两种选择:要不要承担起责任来,允许她或不允许她逛街;要不就让她请示下一个人。这就延伸出了责任链模式。类图如下:

上面处理请求有三个实现类,Father,Husband,Son只要实现构造函数和父类中的抽象方法response方法就可以了,具体由谁处理女性提出的请求,都已转移到了Handler抽象类中。

女性接口代码如下:

package com.jack.responsibilitychain;/*** Created by jack on 2017/8/7.* 女性接口*/
public interface IWomen {/***获得个人状况,通过返回值确定结婚与否,丈夫是否去世* @return*/public int getType();/***获得个人请示,出去逛街还是吃饭* @return*/public String getRequest();
}

女性实现类代码如下:

package com.jack.responsibilitychain;/*** Created by jack on 2017/8/7.* 女性类*/
public class Women implements IWomen{/*** 通过参数来描述妇女的个人状况* 1---未出嫁* 2---出嫁* 3---夫死*/private int type;/*** 妇女的请示*/private String request = "";/*** 构造函数传递过来请求* @param type* @param request*/public Women(int type, String request) {this.type = type;switch (this.type){case 1:this.request = "女儿的请求是:"+request;break;case 2:this.request = "妻子的请求是:"+request;break;case 3:this.request = "母亲的请求是:"+request;break;}}/*** 获得妇女的个人状况* @return*/@Overridepublic int getType() {return this.type;}/*** 获得妇女的请求* @return*/@Overridepublic String getRequest() {return this.request;}
}

下面我们看看Handler怎么实现,代码如下:

package com.jack.responsibilitychain;/*** Created by jack on 2017/8/7.* 处理抽象类*/
public abstract class Handler {/*** 定义常量*/public final static int FATHER_LEVEL_REQUEST = 1;public final static int HUSBAND_LEVEL_REQUEST = 2;public final static int SON_LEVEL_REQUEST = 3;/*** 能处理的级别*/private int level = 0;/*** 责任传递,下一个人责任人是谁*/private Handler nextHandler;public Handler(int level) {this.level = level;}/*** 一个女性要求逛街或吃饭,你需要处理这个请求* @param women*/public final void HandleMessage(IWomen women){if (this.level == women.getType()) {this.response(women);}else {//有后续环节才把请求往后传递if (this.nextHandler != null) {this.nextHandler.HandleMessage(women);}else {//已经没有后续处理人了,不用处理了System.out.println("--没地方请示了,按不同意处理\n--");}}}/*** 如果不属于你处理的请求,你应该让她找下一个环节的人,如果女儿出嫁了,* 还向父亲请示能否逛街,那父亲应该告诉女儿,应该找丈夫请示* @param handler*/public void setNext(Handler handler){this.nextHandler = handler;}/*** 有请示还需要回应,该方法就是表示回应* @param women*/public abstract void response(IWomen women);}

上面使用到了模板方法模式,在模板方法中判断请求的级别和当前能够处理的级别,如果相同则调用基本方法,做出反馈;如果不相等,则传递到下一个环节,有下一个环节做出回应,如果已经达到环节结尾,则直接做不同处理。基本方法response需要各个实现类实现,每个实现类只要实现两个职责:一是定义自己能够处理的级别;二是对请求做出回应。

父亲类代码:

package com.jack.responsibilitychain;/*** Created by jack on 2017/8/7.、* 父亲类*/
public class Father extends Handler{/*** 父亲只处理女儿的请求*/public Father() {super(Handler.FATHER_LEVEL_REQUEST);}/*** 父亲的答复* @param women*/@Overridepublic void response(IWomen women) {System.out.println("---------女儿向父亲请示----------");System.out.println(women.getRequest());System.out.println("父亲的答复是:同意\n");}
}

丈夫类:

package com.jack.responsibilitychain;/*** Created by jack on 2017/8/7.* 丈夫类*/
public class Husband extends Handler{/*** 丈夫只处理妻子的请求*/public Husband() {super(Handler.HUSBAND_LEVEL_REQUEST);}/*** 丈夫请示的答复* @param women*/@Overridepublic void response(IWomen women) {System.out.println("---------妻子向丈夫请示----------");System.out.println(women.getRequest());System.out.println("丈夫的答复是:同意\n");}
}

儿子类:

package com.jack.responsibilitychain;/*** Created by jack on 2017/8/7.* 儿子类*/
public class Son extends Handler{/*** 儿子只处理母亲的请求*/public Son() {super(Handler.SON_LEVEL_REQUEST);}/*** 儿子的答复* @param women*/@Overridepublic void response(IWomen women) {System.out.println("---------母亲向儿子请示----------");System.out.println(women.getRequest());System.out.println("儿子的答复是:同意\n");}
}

测试代码如下:

package com.jack.responsibilitychain;import java.util.ArrayList;
import java.util.Random;/*** Created by jack on 2017/8/7.*/
public class MainTest7 {public static void main(String[] args) throws CloneNotSupportedException {//随机挑选几个女性Random random = new Random();ArrayList<IWomen> womenList = new ArrayList<>();for (int i=0;i<5;i++){womenList.add(new Women(random.nextInt(4), "我要出去逛街"));}//定义三个请示对象Father father = new Father();Husband husband = new Husband();Son son = new Son();//设置请示顺序father.setNext(husband);husband.setNext(son);for (IWomen women: womenList) {father.HandleMessage(women);}}}

测试可能的一种输出如下:

--没地方请示了,按不同意处理
--
--没地方请示了,按不同意处理
--
--没地方请示了,按不同意处理
--
---------女儿向父亲请示----------
女儿的请求是:我要出去逛街
父亲的答复是:同意---------妻子向丈夫请示----------
妻子的请求是:我要出去逛街
丈夫的答复是:同意

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

责任链模式的重点是在链上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果,其通用类图如下:

优点:

责任链模式非常明显的优点是将请求和处理分开。请求者可以不用知道谁处理的,处理者可以不用知道请求的全貌,两者解耦,提供系统的灵活性。

缺点:

责任链有两个非常显著的缺点:一是性能问题,每个请求都是从链同遍历到链尾,特别是在链比较长的时候,性能时一个非常大的问题。二是调试不方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。

代码地址:https://github.com/wj903829182/springboot/tree/master/designpattern/src/main/java/com/jack/responsibilitychain

设计模式10-责任链模式相关推荐

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

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

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

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

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

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

  4. 手撸设计模式之-责任链模式

    手撸设计模式之-责任链模式 一 .责任链模式介绍 1.1 定义 1.2 责任链模式UML结构图 1.3 责任链模式结构详细 1.3 用例代码实现 二.责任链模式应用场景: 2.1 场景概述 2.2 场 ...

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

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

  6. JAVA设计模式之责任链模式(职责链模式)

    转自JAVA设计模式之责任链模式(职责链模式)​​​​​​​ 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...

  7. 软件设计模式之责任链模式实验

    软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...

  8. Java设计模式之责任链模式(二)

    所有设计模式传送门 本文将一起介绍学习下设计模式之责任链模式.责任链模式是指使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有 ...

  9. Java设计模式作业-责任链模式

    Java设计模式作业-责任链模式:Web过滤器 文章目录 前言 一.类图 二.代码及测试结果 1.Trouble类 2.Support类 3.CharSupport类 4.TypeTransformS ...

  10. Java设计模式系列--责任链模式(应用)

    原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...

最新文章

  1. linux java jdk_神级程序员教你如何10分钟在Linux上安装java的JDK?
  2. zlog使用手册,小靠谱啊
  3. linux yum命令作用,YUM命令使用示例
  4. W3 Total Cache+Hacklog Remote Attachment Upyun
  5. 基于Session的认证方式_认证流程_Spring Security OAuth2.0认证授权---springcloud工作笔记114
  6. 基于jeesite的cms系统(一):开发环境搭建
  7. C# 将PDF文件转换为word格式
  8. Python中近期Pandas使用总结
  9. html5 机构化元素
  10. html静态页面制作教程,静态网页制作技术教程(HTML/CSS/JavaScript)
  11. 历年软件设计师 试卷 参考案例解析
  12. Python爬虫入门教程:豆瓣Top电影爬取
  13. nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
  14. puts与fputs的区别
  15. html实现手风琴轮播图,javascript经典特效分享 手风琴、轮播图、图片滑动
  16. thingworx- 用户组
  17. web网页设计实例作业 网页Dreamweaver设计
  18. ubuntu18.04解决wps缺字体问题
  19. css3自学教学,css3精通学习教程(全).pdf
  20. 植物大战僵尸内存地址(转)

热门文章

  1. 怎么批量转换图片格式?这篇文章或许有用
  2. jdk历史版本下载地址
  3. NOD32内网病毒服务器的架设
  4. 一直以为对性能调优十分了解,直到阿里大牛到来,才知道菜是原罪
  5. python批量删除微信好友_Python找出微信上删除你好友的人脚本写法
  6. 使用java技术实现IBM VIAVOICE 语音朗读技术
  7. excel导出java.lang.ArrayIndexOutOfBoundsException: 0 POI导出excel报错数组下标越界0
  8. ap计算机教材pdf百度云,AP计算机A:你需要知道的信息
  9. 自动控制原理模拟卷5
  10. 杰理-手表-AC701-watch-秒针匀速表盘