备注:
责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的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. MySQL:初识数据库

    对于大型互联网公司来说,数据的重要性可能比软件本身更重要.据说淘宝业务系统的开发大概消耗约7000万人民币,而其保存的用户数据的价值远高于此,加上数据分析算法的加持,其产生的价值和收益无疑是巨大的,远 ...

  2. POJ-1182(经典带权并查集)

    食物链 POJ-1182 一个很好的分析博客:https://blog.csdn.net/niushuai666/article/details/6981689 三种关系:两者同类,吃父节点,被父节点 ...

  3. CNN结构演变总结(二)轻量化模型

    CNN结构演变总结(一)经典模型 导言: 上一篇介绍了经典模型中的结构演变,介绍了设计原理,作用,效果等.在本文,将对轻量化模型进行总结分析. 轻量化模型主要围绕减少计算量,减少参数,降低实际运行时间 ...

  4. sanic-jwt 的使用

    Sanic 是基于 Python 的一个支持高并发的异步 web 框架,sanic-jwt 则是针对Sanic 开发的一个基于 PyJWT 封装的 JWT 授权认证模块. sanic-jwt 项目主页 ...

  5. 关于PHP的isset()函数

      1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 <meta cha ...

  6. LNMP配置——Nginx配置 ——访问控制

    #vi /usr/local/nginx/conf/vhost/test.com.conf 写入: server { listen 80; server_name test.com test1.com ...

  7. 关于java的访问修饰符权限

    作用域    public protected default private  同一个类   yes     yes      yes      yes 同一个包   yes     yes    ...

  8. 【Azure 应用程序见解】 Application Insights 对App Service的支持问题

    问题描述 Web App 发布后, Application Insights 收集不到数据了 问题分析 在应用服务(App Service)中收集应用的监控数据(如Request,Exception, ...

  9. Java中的集合Set - 入门篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合Set - 入门篇>,希望对大家有帮助,谢谢 简介 前面介绍了集合List,映射Map,最后再简单介绍下集合Set,相关类如下 ...

  10. 此博客使用的CSS样式详解!

    此博客使用的CSS样式详解! 页面使用的博客园模板为:LuxInteriorLight,可以在博客皮肤里找到. 页首屏蔽广告代码 <script>console.log("顶部标 ...