最近在学习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. 用vue做的购物车结算的功能

    <!-- 占位 --> <template> <div> <div class="product_table"> <div c ...

  2. django部署后样式加载不出来解决方案

    django部署后样式加载不出来 1.html文件去掉<!DOCTYPE html> 2. location /static { alias /home/static/; } 3.STAT ...

  3. CSS显示模式

    div和span标签 1.容器级的标签中可以嵌套其他所有的标签(div->一般用于配合CSS完成网页的基本布局.h.ul.ol.dl.li.dt.dd......),文本级的标签中只能嵌套文字/ ...

  4. c#传不确定的参数个数,比如int型

    a(params int[] ) 调用时a(1,2,3,4,5,6)

  5. ogr ogr2ogr 矢量数据格式转换 ogrinfo 矢量数据图层信息操作 ogr gdal的一部分 gdal 命令行 库操作

  6. Faster, more memory efficient and more ordered dictionaries on PyPy

    Faster, more memory efficient and more ordered dictionaries on PyPy https://morepypy.blogspot.com/20 ...

  7. SQLServer 拼接列

    想把表里modified_by和source这两列拼接成一行

  8. 【笔试题】某公司中有N名员工。给定所有员工工资的清单

    排列员工工资顺序(C++map解法) 题目描述:某公司中有N名员工.给定所有员工工资的清单,财务人员要按照特定的顺序排列员工的工资.他按照工资的频次降序排列.即给定清单中所有频次较高的工资将在频次较低 ...

  9. 003-结构型-03-代理模式(Proxy)

    一.概述 Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问. 可以详细控制访问某个类或对象的方法,在调用这个方法(流程代码放到代理 ...

  10. Qt编写自定义控件67-通用无边框

    一.前言 在之前的一篇文章中写过一个通用的移动控件,作用就是用来传入任意的widget控件,可以在父类容器中自由移动.本篇文章要写的是一个通用的无边框类,确切的说这不叫控件应该叫组件才对,控件是要看得 ...