最近在学习netty中发现其中用到了责任链模式,然后结合自己在写代码中遇到了大量写if...else的情况,决定学习一下责任链模式。

一.什么样的场景下会选择用责任链模式

  我们在进行业务逻辑判断时,需要根据传入参数类型的不同做出不同的处理,如果在传入的参数类型相对较少的情况时,可以用if...else来做判断,这样的确是没有什么问题的,但是如果后期由于业务系统的扩展,导致参数类型会随之延伸出很多种不同的处理,这时就需要用责任链模式来抒代码重构,这样会让代码封装的更好、更简洁,阅读性更强,后期如果增加了新的处理场景,只需要增加新的类就行,不会对原代码有很大的改动。

责任链模式的使用,会让方法的调用像递归一样的调用向后传递,如果传入的参数类型符合第1个handler处理的定义,那么就由第1个handler进行处理,如果不能处理,那就交由后续的handler进行处理。

大量的写if...else是可以解决问题,但个人认为写多了,这样的if...else就像一面墙一样,在等着请求类型的不同来选择不同的方法进行处理,而责任链是一条线一样的处理模式,能处理就由当前的处理,不能处理则由后面的handler处理。

二.责任链模式的编写

  1.抽象1个总的handler

  2.编写3个实现类来实现handler

  3.请求类

  4.客户端测试类

/**
* 处理机器人请求
*
* @author pengbo.zhao
* @data 2019年12月7日 下午1:51:17
*/
public abstract class Handler { public final static String REQUEST_TYPE_ORDER = "order"; //订单处理
public final static String REQUEST_TYPE_HOT = "hot"; //热点问处理
public final static String REQUEST_TYPE_HIS = "his"; //历史记录处理 private String type; private Handler netxtHandler; public Handler(String type){
this.type = type;
} public final void handlerChain(Request request){
if(request.getName().equals(this.type)){
this.handler(request);
}else{
if(this.netxtHandler !=null){
this.netxtHandler.handlerChain(request);//递归的调用下一个实现handler类的这个方法
}else{
//需要根据业务做其它的处理
System.out.println("需要做其它的处理。。。。。。");
}
}
} public void nextHandler(Handler handler){//设置下一个处理的handler
this.netxtHandler = handler;
} protected abstract void handler(Request request);//实现类重写
}
import java.util.Map.Entry;

/**
* 订单处理
*
* @author pengbo.zhao
* @data 2019年12月7日 下午2:13:48
*/
public class OrderHandler extends Handler{ public OrderHandler(String type) {//子类在继承父类时,虚拟机会先加载父类的属性,先将父类的加载完毕后才能让子类加载,当加载到这里时子类会将传入的参数传递给父类,让父类先加载完成,然后才能加载子类,否则父类不能完全加载
super(Handler.REQUEST_TYPE_ORDER);
} @Override
protected void handler(Request request) {
System.err.println("OrderHandler...........");
for (Entry<String, String> entry : request.getParamterMap().entrySet()) {
System.out.println("key = "+entry.getKey() +" map = "+entry.getValue());
}
} }
public class HisHandler extends Handler{

    public HisHandler(String type) {
super(Handler.REQUEST_TYPE_HIS);
} @Override
protected void handler(Request request) {
System.err.println("HisHandler...........");
for (Entry<String, String> entry : request.getParamterMap().entrySet()) {
System.out.println("key = "+entry.getKey() +" map = "+entry.getValue());
}
} }
public class HotHandler extends Handler{

    public HotHandler(String type) {
super(Handler.REQUEST_TYPE_HOT);
} @Override
protected void handler(Request request) {
System.err.println("HotHandler...........");
for(Entry<String, String> entry :request.getParamterMap().entrySet()){
System.out.println("key = "+entry.getKey() +" value = "+entry.getValue());
}
} }

请求类

public class Request {

    public Request(String name, Map<String, String> paramterMap) {
this.name = name;
this.paramterMap = paramterMap;
}
private String name;
private Map<String,String> paramterMap;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map<String, String> getParamterMap() {
return paramterMap;
}
public void setParamterMap(Map<String, String> paramterMap) {
this.paramterMap = paramterMap;
} }

测试类

public class Test {
public static void main(String[] args) {
String types [] = {"order","hot","his"};
Map<String,String> paramMap = new HashMap<>();
paramMap.put("key_1", "value_1");
paramMap.put("key_2", "value_2");
Request request = new Request(types[new Random().nextInt(3)],paramMap); Handler orderHandler = new OrderHandler(Handler.REQUEST_TYPE_ORDER);
Handler hotHandler = new HotHandler(Handler.REQUEST_TYPE_HOT);
Handler hishandler = new HisHandler(Handler.REQUEST_TYPE_HIS); orderHandler.nextHandler(hotHandler);
hotHandler.nextHandler(hishandler); orderHandler.handlerChain(request); }
}

java23种设计模式之十:责任链模式的更多相关文章

  1. Python使用设计模式中的责任链模式与迭代器模式的示例

    Python使用设计模式中的责任链模式与迭代器模式的示例 这篇文章主要介绍了Python使用设计模式中的责任链模式与迭代器模式的示例,责任链模式与迭代器模式都可以被看作为行为型的设计模式,需要的朋友可 ...

  2. Java设计模式13:责任链模式

    前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时间去提升自己的技术能力.技术视野,所以开一个系列文章,标题就轻松一点叫做最 ...

  3. 《java设计模式》之责任链模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  4. [设计模式] javascript 之 责任链模式

    责任链模式:定义 责任链接模式又称职责链模式,是一种对象的行为模式:它是一种链式结构,每个节点都有可能两种操作,要么处理该请求停止该请求操作,要么把请求转发到下一个节点,让下一个节点来处理请求:该模式 ...

  5. Java设计模式系列之责任链模式

    责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道 ...

  6. Java设计模式学习记录-责任链模式

    前言 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式). 责任链模式 概念介绍 责任链模式是为了避免 ...

  7. Java描述设计模式(15):责任链模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景描述 1.请假审批流程 公司常见的请假审批流程:请假天数 当 day<=3 天,项目经理审批 当 3<day<= ...

  8. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  9. Head First设计模式——生成器和责任链模式

    生成器 生成器模式:封装一个产品的构造过程,并允许按步骤构造. 现又一个度假计划指定,需要指定度假每一天的活动.旅馆.用餐.门票等等事情,但是每个客人的度假计划可能不太一样.例如天数.活动类型.用餐等 ...

随机推荐

  1. Struts2.5入门之环境设置

    1. 下载Struts2.5,下载地址 2. 新建项目struts2 3. 解压后将struts\lib下的所有jar包复制到WEB-INF/lib文件夹下 4. 修改web.xml配置文件,添加如下 ...

  2. ICEM-蜗壳

    原视频下载地址:https://yunpan.cn/cY8XxpyLN4QaE  访问密码 a792

  3. 开源JS图片裁剪插件

    开源JS图片裁剪插件 一.总结 一句话总结: 要用点赞最高的插件,这样适用性最好,效果最好,出问题的概率也最低,这里电脑端和手机端都可以用的建议用 cropper.js 二.5款好用的开源JS图片裁剪 ...

  4. (基因功能 & 基因表达调控)研究方案

    做了好久的RNA-seq分析,基因表达也在口头溜了几年了,但似乎老是浮在表面. 对一件事的了解程度决定了你的思维深度,只想做技工就不用想太多,想做大师就一定要刨根问底. 老是说基因表达,那么什么是基因 ...

  5. JVM 字节码的结构

    编译的.class文件,可以用javap进行反编译 javap Test.class javap -c Test.class javap -verbose Test.class 1.创建MyTest1 ...

  6. 系统中sshd进程的查看,数量统计,进程号输出,进程清理命令

    1. 查看sshd进程 ps -ef|grep sshd ps -ef:打开所有的进程 grep sshd:过滤出含有“sshd”字符的进程. 2. 查看sshd进程中的sftp进程,不含查询的进程 ...

  7. Android命名规范(重点讲解:包名)

    Android程序开发中,使用规范的命名有益于程序的开发和后期阅读.本文主要对Android程序包名的定义做详细介绍,并附带一些简单的命名规则. 一.标识符命名方法1 .小驼峰命名法,除首单词外,其余 ...

  8. TypeScript泛型类 - 把类作为参数类型的泛型类

    /* TypeScript泛型类 - 把类作为参数类型的泛型类 */ /* 泛类:泛型可以帮助我们避免重复的代码以及对不特定数据类型的支持(类型校验),下面我们看看把类当做参数的泛型类 1.定义个类 ...

  9. openresty开发系列26--openresty中使用redis模块

    openresty开发系列26--openresty中使用redis模块 在一些高并发的场景中,我们常常会用到缓存技术,现在我们常用的分布式缓存redis是最知名的, 操作redis,我们需要引入re ...

  10. github上fork分支后再合入原master分支的改动

    几个月前看到一个电商项目,文档比较全,fork下来学习下.后来因为其他事情耽搁了,现在想重新看看,发现改动比较大,master分支跟我fork下来的分支不一样了.咋办?简单,把最新的master分支下 ...