备注:
责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑
主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 策略模式的客户端知道所有算法以及各种算法的区别

package com.gabriel.stage.design;

import cn.hutool.core.collection.CollectionUtil;
import com.gabriel.stage.common.enums.HandlerBeanEnum;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;
import java.util.LinkedList;
import java.util.List; /**
* @author: Gabriel
* @date: 2020/3/15 23:53
* @description 职责处理器
*/
@Component
public class ExecuteHandler { @Autowired
private ApplicationContext context; private List<Handler> handlerList = new LinkedList<>(); private Handler handler; public Handler getHandler() {
return handler;
} /**
* 该方法会在该对象创建之后被调用
*
* @throws Exception
*/
@PostConstruct
public void afterPostConstruct() throws Exception {
HandlerBeanEnum[] values = HandlerBeanEnum.values();
for (HandlerBeanEnum value : values) {
Handler bean = context.getBean(value.getBeanName(), Handler.class);
handlerList.add(bean);
}
if (CollectionUtil.isNotEmpty(handlerList)) {
for (int i = 1; i < handlerList.size(); i++) {
//当前处理器
Handler currentHandler = handlerList.get(i - 1);
//下一个处理器
Handler nextHandler = handlerList.get(i);
//将处理器串成链表
currentHandler.setNextHandler(nextHandler);
}
this.handler = handlerList.get(0);
} } }
package com.gabriel.stage.design;

import org.springframework.stereotype.Component;

/**
* @author: Gabriel
* @date: 2020/3/15 23:41
* @description A处理器
*/
@Component("aHandler")
public class AHandler extends Handler { private final Integer order = 1; private Handler nextHandler; @Override
public Handler getNextHandler() {
return nextHandler;
} @Override
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
} public final Integer myNum = 10; @Override
public void dealRequest(Integer num) {
if (myNum.equals(num)) {
System.out.println("num==10,A责任链处理");
}else {
//交给下一个处理器处理
nextHandler.dealRequest(num);
}
}
}
package com.gabriel.stage.design;

import lombok.Data;
import org.springframework.stereotype.Component; /**
* @author: Gabriel
* @date: 2020/3/15 23:41
* @description B处理器
*/
@Component("bHandler")
public class BHandler extends Handler { private final Integer order = 2; private Handler nextHandler; @Override
public Handler getNextHandler() {
return nextHandler;
} @Override
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
} public final Integer myNum = 100; @Override
public void dealRequest(Integer num) {
if (myNum == num) {
System.out.println("num==100,B责任链处理");
}else {
nextHandler.dealRequest(num);
}
}
}
package com.gabriel.stage.design;

import org.springframework.stereotype.Component;

/**
* @author: Gabriel
* @date: 2020/3/15 23:41
* @description C处理器
*/
@Component("cHandler")
public class CHandler extends Handler { private final Integer order = 3; @Override
public void dealRequest(Integer num) {
System.out.println("num!=10 && num!=100,C责任链处理");
}
}
package com.gabriel.stage.common.enums;

import lombok.AllArgsConstructor;
import lombok.Getter; /**
* @author: Gabriel
* @date: 2020/3/16 14:32
* @description 处理器Bean枚举
*/
@Getter
@AllArgsConstructor
public enum HandlerBeanEnum { AHandler("aHandler"),
BHandler("bHandler"),
CHandler("cHandler"); private String beanName;
}
    @Autowired
private ExecuteHandler executeHandler;
/**
* 测试责任链模式
* @return
*/
@GetMapping("/test/{num}")
public Result testHandler(@PathVariable Integer num){
Handler handler = executeHandler.getHandler();
handler.dealRequest(num);
return Result.success();
}

【责任链模式】责任链模式结合Spring实战Demo的更多相关文章

  1. 【策略模式】策略模式结合Spring实战Demo

    策略模式 策略模式用于解决判断分支过多的问题,使代码变得简洁和优雅, 策略模式在多种方式在项目中落地,下面举例说明通过指定不同类型的订单使用策略模式执行不同的业务逻辑 文章参考自公众号:石杉的架构笔记 ...

  2. Java进阶篇设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  3. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  4. Java设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  5. 《Android源码设计模式》--状态模式--责任链模式--解释器模式--命令模式--观察者模式--备忘录模式--迭代器模式

    [状态模式] No1: Wifi设置界面是一个叫做WifiSetting的Fragment实现的 No2: 在不同的状态下对于扫描Wifi这个请求的处理是完全不一样的.在初始状态下扫描请求被直接忽略, ...

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

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

  7. 职责链模式vs状态模式区别

    状态模式在具体状态里设置了下一状态. 而职责链模式是在客户端代码里设置了下一状态的处理对象. 如果状态模式里的任何一环缺失,将导致事情无法进行下去.职责链模式的链式在客户端连接的,也就是说,如果我们请 ...

  8. 基于.net 职责链来实现 插件模式

    插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能从框架中剥离出来 让第三方有机会来 ...

  9. .net 职责链来实现 插件模式

    .net 职责链来实现 插件模式 插件式的例子 QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了 eclipse ,X Server 等等 插件式的好处 插件降低框架的复杂性,把扩展功能 ...

随机推荐

  1. Flask:Jinjia模板

    Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能. 一.变量 1.1 手动传入的变量: 基本类型:{{ var }} 字 ...

  2. 上百本电子书(Java/Hadoop/Spark/Linux/机器学习/)免费分享 百度云持续更新

    分享一下自己整理的超多电子书, 其中包括:Java,Hadoop,Spark,Linux,Hbase,Hive,机器学习,区块链 目录如下: 1 Java 基础 2 Java 虚拟机 3 Java 并 ...

  3. python工业互联网应用实战7—业务层

    本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...

  4. css实现京东顶部导航条

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  5. 【图像处理】OpenCV+Python图像处理入门教程(五)阈值处理

    这篇随笔介绍使用OpenCV进行图像处理的第五章 阈值处理. 5  阈值处理 阈值是指像素到达某临界值.阈值处理表示像素到达某临界值后,对该像素点进行操作和处理. 例如:设定一幅图像素阈值为200,则 ...

  6. 攻防世界 reverse 进阶5-7

    5.re-for-50-plz-50  tu-ctf-2016 流程很简单,异或比较 1 x=list('cbtcqLUBChERV[[Nh@_X^D]X_YPV[CJ') 2 y=0x37 3 z= ...

  7. 【linux】系统编程-4-共享内存

    目录 前言 6. 共享内存 6.1 概念 6.2 操作函数 6.2.1 shmget() 6.2.2 shmat() 6.2.3 shmdt() 6.2.4 shmctl() 6.3 例子 参考: 前 ...

  8. java例题_49 计算子串出现的次数

    1 /*49 [程序 49 子串出现的个数] 2 题目:计算字符串中子串出现的次数 3 */ 4 5 /*分析 6 * 1.子串的出现是有标志的,如" ",*,#或者其他 7 * ...

  9. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  10. Linux 用户和用户组管理(useradd userdel groupadd groupdel)

    Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. Linux系统用户账户的 ...