备注:
责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的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. 基于CefSharp开发浏览器(八)浏览器收藏夹栏

    一.前言 上一篇文章 基于CefSharp开发(七)浏览器收藏夹菜单 简单实现了部分收藏夹功能 如(添加文件夹.添加收藏.删除.右键菜单部分功能) 后续代码中对MTreeViewItem进行了扩展,增 ...

  2. 微信小程序一周时间表

    <view class="dateView"> <image class="dateLeft" bindtap="prevWeek& ...

  3. 『力荐汇总』这些 VS Code 快捷键太好用,忍不住录了这34张gif动图

    之前写过三篇文章,收获了极其不错的阅读量与转发量: 你真的会用 VS Code 的 Ctrl.Shift和Alt吗?高效易用的快捷键:多光标.跳转引用等轻松搞定 VS Code 中的 Vim 操作 | ...

  4. SQL-MYSQL的时间格式转换(持续补充)

    ======================SQLSERVER===================================== SELECT CONVERT(varchar(100), GE ...

  5. FreeBSD jail 折腾记(二)

    FreeBSD jail 折腾记(二) 创建jail目录 创建4个 分别是模板 骨架 数据 项目 创建模板目录 mkdir -p /jail/j1 # 然后放入基本目录,上篇说过不再写 创建骨架目录 ...

  6. 【odoo14】第三章、创建插件

    现在我们已经有了开发环境并了解了如何管理实例及数据库,现在让我们来学习下如何创建插件模块. 本章内容如下: 创建和安装模块 完成manifest文件 组织模块文件结构 添加模型 添加菜单及视图 添加访 ...

  7. Lzzy高级语言程序设计之while循环

    public class Mq2 { public static void main(String[]args) { int b = 3; while (b < 7) { System.out. ...

  8. AES加密--适用于RC2、RC4和Blowfish

    package test; import java.security.GeneralSecurityException; import java.security.Key; import javax. ...

  9. 部署Angular应用到Github pages

    https://jeneser.github.io/blog/2017/08/08/angular-deploying-app-github-pages/ Published: August 08, ...

  10. Prometheus时序数据库-数据的查询

    Prometheus时序数据库-数据的查询 前言 在之前的博客里,笔者详细阐述了Prometheus数据的插入过程.但我们最常见的打交道的是数据的查询.Prometheus提供了强大的Promql来满 ...