• 责任链设计模式


     流水线的干活 !!!!!!

     

    1. package com.dj.springtest.demo;
    2. /**
    3. * User: ldj
    4. * Date: 2023/10/15
    5. * Time: 15:37
    6. * Description: 责任链模式测试
    7. */
    8. public abstract class GatewayHandler {
    9. /**
    10. * 下一个步骤的执行处理器
    11. */
    12. protected GatewayHandler nextHandler;
    13. /**
    14. * 设置下一个步骤的执行处理器
    15. */
    16. public void setNextHandler(GatewayHandler handler){
    17. this.nextHandler = handler;
    18. }
    19. /**
    20. * 用于业务拓展的抽象方法
    21. */
    22. public abstract void execute();
    23. }

     

     

     后续补充:  变更点节点之间串联策略改成配置的

    1. package com.dj.springtest.constant;
    2. import com.dj.springtest.model.entity.GatewayStrategyEntity;
    3. /**
    4. * User: ldj
    5. * Date: 2023/10/15
    6. * Time: 22:51
    7. * Description: 网关策略配置,还可以做成配置文件形式
    8. * 如: api_flow_handler=1,null,2,com.dj.springtest.component.FlowGatewayHandler,Api接口限流
    9. * 使用 @Value 拿到配置value.split(),根据下标拿到对映的值
    10. */
    11. public enum GatewayStrategyEnum {
    12. //枚举配置了节点之间的执行顺序
    13. API_FLOW_HANDLER(new GatewayStrategyEntity(1, null, 2, "com.dj.springtest.component.FlowGatewayHandler", "Api接口限流")),
    14. BLACK_LIST_HANDLER(new GatewayStrategyEntity(2, 1, 3, "com.dj.springtest.component.BlackListGatewayHandler", "黑名单拦截")),
    15. USER_SESSION_HANDLER(new GatewayStrategyEntity(3, 2, null, "com.dj.springtest.component.SessionGatewayHandler", "用户会话拦截"));
    16. GatewayStrategyEntity gatewayEntity;
    17. GatewayStrategyEnum(GatewayStrategyEntity entity) {
    18. this.gatewayEntity = entity;
    19. }
    20. public GatewayStrategyEntity getGatewayEntity() {
    21. return gatewayEntity;
    22. }
    23. public void setGatewayEntity(GatewayStrategyEntity gatewayEntity) {
    24. this.gatewayEntity = gatewayEntity;
    25. }
    26. }
    1. package com.dj.springtest.factory;
    2. import com.dj.springtest.component.abstractClass.GatewayHandler;
    3. import com.dj.springtest.model.entity.GatewayStrategyEntity;
    4. import com.dj.springtest.service.GatewayService;
    5. import com.dj.springtest.service.impl.GatewayServiceImpl;
    6. import lombok.extern.slf4j.Slf4j;
    7. import java.util.Objects;
    8. /**
    9. * User: ldj
    10. * Date: 2023/10/15
    11. * Time: 22:25
    12. * Description: 工厂类
    13. */
    14. @Slf4j
    15. public class GatewayHandlerFactory {
    16. private static GatewayService gatewayService = new GatewayServiceImpl();
    17. /**
    18. * 配置
    19. * @return
    20. */
    21. public static GatewayHandler getStarterGatewayHandler() {
    22. //获取首节点网关处理器
    23. GatewayStrategyEntity firstNodeStrategyEntity = gatewayService.getFirstNodeGatewayStrategy();
    24. GatewayHandler firstNodeGatewayHandler = createGatewayHandler(firstNodeStrategyEntity);
    25. if (Objects.isNull(firstNodeGatewayHandler)) {
    26. return null;
    27. }
    28. Integer postHandlerId = null;
    29. //临时数据,在避免遍历时,覆盖最初的值
    30. GatewayHandler tempGatewayHandler = firstNodeGatewayHandler;
    31. //TODO >>>>>>> 核心:串联所有的节点(GatewayHandler) <<<<<<<<
    32. //如果第一个节点有下一个节点,就根据postHandlerId获取下一个节点策略实体并实例化下一个GatewayHandler
    33. while ((postHandlerId = firstNodeStrategyEntity.getPostHandlerId()) != null) {
    34. GatewayStrategyEntity nextStrategyEntity = gatewayService.getGatewayStrategyById(postHandlerId);
    35. GatewayHandler nextGatewayHandler = createGatewayHandler(nextStrategyEntity);
    36. if (Objects.nonNull(nextGatewayHandler)) {
    37. //第一(上)个节点串联下一个节点
    38. firstNodeGatewayHandler.setNextHandler(nextGatewayHandler);
    39. //将遍历对象改成下一个节点
    40. firstNodeStrategyEntity = nextStrategyEntity;
    41. firstNodeGatewayHandler = nextGatewayHandler;
    42. }
    43. }
    44. return tempGatewayHandler;
    45. }
    46. /**
    47. * 根据全限定类名反射实例化GatewayHandler
    48. *
    49. * @param gatewayEntity
    50. * @return
    51. */
    52. private static GatewayHandler createGatewayHandler(GatewayStrategyEntity gatewayEntity) {
    53. //全限定类名
    54. String reference = gatewayEntity.getReference();
    55. try {
    56. Class clazz = Class.forName(reference);
    57. return (GatewayHandler) clazz.newInstance();
    58. } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
    59. log.error("[GatewayHandlerFactory] [{}]初始化失败!", reference, e);
    60. }
    61. return null;
    62. }
    63. }
    1. package com.dj.springtest.service;
    2. import com.dj.springtest.model.entity.GatewayStrategyEntity;
    3. /**
    4. * User: ldj
    5. * Date: 2023/10/15
    6. * Time: 23:18
    7. * Description: No Description
    8. */
    9. public interface GatewayService {
    10. /**
    11. * 根据handlerId获取网关策略
    12. */
    13. GatewayStrategyEntity getGatewayStrategyById(Integer handlerId);
    14. /**
    15. * 获取首节点(链路第一个节点)的网关策略
    16. */
    17. GatewayStrategyEntity getFirstNodeGatewayStrategy();
    18. }
    1. package com.dj.springtest.service.impl;
    2. import com.dj.springtest.constant.GatewayStrategyEnum;
    3. import com.dj.springtest.model.entity.GatewayStrategyEntity;
    4. import com.dj.springtest.service.GatewayService;
    5. import java.util.Arrays;
    6. import java.util.Map;
    7. import java.util.Objects;
    8. import java.util.stream.Collectors;
    9. /**
    10. * User: ldj
    11. * Date: 2023/10/15
    12. * Time: 23:27
    13. * Description: No Description
    14. */
    15. public class GatewayServiceImpl implements GatewayService {
    16. private static Map gatewayStrategyMap;
    17. //初始化加载网关策略配置信息
    18. static {
    19. GatewayStrategyEnum[] strategy = GatewayStrategyEnum.values();
    20. gatewayStrategyMap = Arrays.stream(strategy).collect(Collectors.toMap(k -> k.getGatewayEntity().getHandlerId(), GatewayStrategyEnum::getGatewayEntity));
    21. }
    22. @Override
    23. public GatewayStrategyEntity getGatewayStrategyById(Integer handlerId) {
    24. return gatewayStrategyMap.get(handlerId);
    25. }
    26. @Override
    27. public GatewayStrategyEntity getFirstNodeGatewayStrategy() {
    28. for (Map.Entry strategyEntityEntry : gatewayStrategyMap.entrySet()) {
    29. GatewayStrategyEntity gatewayStrategyEntity = strategyEntityEntry.getValue();
    30. Integer preHandlerId = gatewayStrategyEntity.getPreHandlerId();
    31. //当前的GatewayHandler没有指向上一个节点,那它就是第一个
    32. if(Objects.isNull(preHandlerId)){
    33. return gatewayStrategyEntity;
    34. }
    35. }
    36. return null;
    37. }
    38. }
    1. package com.dj.springtest.demo;
    2. import com.dj.springtest.component.abstractClass.GatewayHandler;
    3. import com.dj.springtest.factory.GatewayHandlerFactory;
    4. import java.util.Objects;
    5. /**
    6. * User: ldj
    7. * Date: 2023/10/16
    8. * Time: 0:53
    9. * Description: No Description
    10. */
    11. public class TestGatewayHandler2 {
    12. public static void main(String[] args) {
    13. GatewayHandler firstNodeGatewayHandler = GatewayHandlerFactory.getStarterGatewayHandler();
    14. if(Objects.nonNull(firstNodeGatewayHandler)){
    15. firstNodeGatewayHandler.execute();
    16. }
    17. }
    18. }

  • 相关阅读:
    前端富文本编辑器 vue + tinymce超简单使用方法
    Linux- inode & vnode
    Python数据结构与算法6
    ESLint自动修复代码规范错误
    安装GPU驱动,CUDA Toolkit和配置与CUDA对应的Pytorch
    使用Java将PPT、PPTX和PDF转换为图片
    SolidWorks快捷键
    boost 压缩与解压缩流
    Mac node nvm 切换版本,指定版本
    世界坐标系,相机坐标系,像素坐标系转换 详细说明(附代码)
  • 原文地址:https://blog.csdn.net/dj1955/article/details/133844521