Springboot中使用策略模式+工厂模式

2023-11-04

策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式?

  具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE....。接下来咱们直接实现,项目结构图:

工厂类FactoryStrategy负责创建策略的工厂,代码比较简单,比较关键的一点是AutoWired一个Map<String, Strategy> 这个会在初始化的时候将所有的Strategy自动加载到Map中,是不是很方便。使用concurrentHashMap是防止多线程操作的时候出现问题。同时还要注意@Service注解。

package com.hqs.pattern.factory;

import com.hqs.pattern.strategy.Strategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author huangqingshi
 * @Date 2019-01-31
 */
@Service
public class FactoryForStrategy {

    @Autowired
    Map<String, Strategy> strategys = new ConcurrentHashMap<>(3);

    public Strategy getStrategy(String component) throws Exception{
        Strategy strategy = strategys.get(component);
        if(strategy == null) {
            throw new RuntimeException("no strategy defined");
        }
        return strategy;
    }

}

接下来就是Strategy接口,就一个doOperation方法。

package com.hqs.pattern.strategy;

/**
 * @author huangqingshi
 * @Date 2019-01-31
 */
public interface Strategy {

    String doOperation();

}

定义接口的实现,我定义了三个, 都类似,这里我就放出一个来吧。Component里边的one是指定其名字,这个会作为key放到Map strategys里边。

package com.hqs.pattern.strategy.impl;

import com.hqs.pattern.strategy.Strategy;
import org.springframework.stereotype.Component;

/**
 * @author huangqingshi
 * @Date 2019-01-31
 */
@Component("one")
public class StrategyOne implements Strategy {
    @Override
    public String doOperation() {
        return "one";
    }
}

好了,写一个Controller类,用于进行测试,当然我还是使用swagger,使用swagger的时候有个细节,就是注意生产上一定不能打开,否则是个非常可怕的事情。

package com.hqs.pattern.controller;

import com.hqs.pattern.factory.FactoryForStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @author huangqingshi
 * @Date 2019-01-31
 */
@Controller
public class StrategyController {

    @Autowired
    FactoryForStrategy factoryForStrategy;

    @PostMapping("/strategy")
    @ResponseBody
    public String strategy(@RequestParam("key") String key) {
        String result;
        try {
            result = factoryForStrategy.getStrategy(key).doOperation();
        } catch (Exception e) {
            result = e.getMessage();
        }
        return result;
    }


}

 

参考:

https://www.cnblogs.com/huangqingshi/p/10344265.html

http://blog.hewie.cn/article/2022033900

https://www.cnblogs.com/xiufengchen/p/11609691.html

https://blog.csdn.net/Lin_JunSheng/article/details/110037918

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot中使用策略模式+工厂模式 的相关文章

随机推荐

  • [1016]DataFrame一列拆成多列以及一行拆成多行

    文章目录 DataFrame一列拆成多列 DataFrame一行拆成多行 分割需求 简要流程 详细说明 0 初始数据 1 使用split拆分 2 使用stack行转列 3 重置索引 删除多余的索引 并命名为C 4 使用join合并数据 Da
  • 【滤波跟踪】基于无迹卡尔曼滤波实现惯性导航+DVL的组合导航算法附matlab代码

    1 内容介绍 水下航行器 的产生 发展直至实际使用经过了很长的历程 对于海洋人们从了解认识 开发研究 使用和保护等方面的发展 促使着水下航行器的开发研究工作也逐渐活跃起来 在新世纪中水下航行器还将被重点开发应用 水下航行器研制的重要标准之一
  • EXT4文件系统挂载成功后执行init文件linuxrc失败

    Hi3559av100平台 制作EXT4文件系统在EMMC存储设备上启动 发现EXT4文件系统挂载成功后执行init文件linuxrc失败 分析原因如下 错误打印 sdhci Secure Digital Host Controller I
  • 王道考研——计算机网络(第一章 计算机网络体系结构)

    1 0认识计算机网络 在下载电影 不会出现乱序问题 和微信收发消息 比如表情包乱序了 所使用的协议是不同的 1 1 1概念和功能 1 计算机网络的概念 2 计算机网络的功能 3 计算机网络的发展 第一阶段 小写的 internet 就是这样
  • 第七课 学习韦东山老师STM32F103 迷你核心单片机Mini开发板

    本节课为 7天物联网智能家居实战训练营1期 的第7节课 也是最后1节课 文章目录 一 基础班7节课 项目完善与总结回顾 二 项目实例优化 三 总结回顾 四 互动环节 一 基础班7节课 项目完善与总结回顾 第一部分 一 对项目进行功能改进优化
  • 应用架构COLA 2.0

    很多同学不止一次和我反馈 我们的系统很混乱 主要表现在 应用的层次结构混乱 不知道应用应该如何分层 应该包含哪些组件 组件之间的关系是什么 缺少规范的指导和约束 新加一段业务逻辑不知道放在什么地方 哪个类 哪个包 应该起什么名字比较合适 解
  • Arduino篇(二)火焰、烟雾、CO等多个传感器组合实验设计

    最近用Arduino做了一个简单的多个传感器组合的实验 比较简单 设想的应用场景是火灾检测 如下图所示 一 实验材料 MQ 2烟雾传感器 5路火焰传感器 CO一氧化碳传感器 无源蜂鸣器 LED灯 arduino mega开发板 面包板以及杜
  • java面试汇总

    java面试汇总 基础篇 1 一个 java 源文件中是否可以包括多个类 不是内部类 有什么限制 可以有多个类 但只能有一个public的类 并且public的类名必须与文件名相一致 2 Java有没有goto java中的保留字 现在没有
  • 神经网络学习小记录-番外篇——常见问题汇总

    神经网络学习小记录 番外篇 常见问题汇总 前言 问题汇总 1 下载问题 a 代码下载 b 权值下载 c 数据集下载 2 环境配置问题 a 20系列所用的环境 b 30系列显卡环境配置 c CPU环境配置 d GPU利用问题与环境使用问题 e
  • springcloud配置中心_Spring Cloud集成Apollo分布式配置中心(含源代码)

    在Spring Cloud项目中使用Apollo 分布式配置中心之前 需要先启动Apollo的配置服务端 具体操作步骤 可参看如下链接 携程Apollo 阿波罗 分布式配置中心 总体架构设计和核心概念 携程Apollo 分布式配置中心 本地
  • 2021长安二中高考成绩查询,最全!2020年陕西省50所高中高考成绩汇总&数据分析!...

    原标题 最全 2020年陕西省50所高中高考成绩汇总 数据分析 目前 陕西省部分高中学校2020年的高考成绩流传出来 为家长们津津乐道 本文汇总了包含西安 宝鸡 咸阳 渭南 延安等各地市共50所学校的高考成绩 供家长们参考 2020年西安市
  • Spring启动的bean回调函数

    启动时调用 Spring启动时bean会按照如下顺序进行回调 构造函数 实现ApplicationContextAware的函数 PostConstruct标注的函数 实现InitializingBean接口的函数 Bean注解中initM
  • Boost练习程序(智能指针)

    include
  • 前端项目review之修改element-ui全局主题颜色配置element-theme-chalk和gulp

    每个公司的主题风格肯定是不一样的 比如现在的公司主题就是 00ab7a 在PC端TO B的项目中少不了用element ui 这个时候用element theme chalk直接本地编译修改了element全局的主题色 一 修改默认主题配色
  • 爬虫的概念

    爬虫 模拟浏览器的行为 向服务器发送请求 获取响应中的数据 往白了说就是模拟浏览器的行为 掌握要点 如何更像的模拟浏览器的行为 总结 浏览器能拿到的数据 就一定可以爬到 浏览器拿不到的数据 就一定爬不到
  • 【Ubuntu】Ubuntu系统启动过程中,输入用户名与密码后登录一直卡在紫色界面问题(未解决,最后通过重装系统)

    Ubuntu Ubuntu系统启动过程中 输入用户名与密码后登录一直卡在紫色界面问题 未解决 最后通过重装系统 参考文章 1 Ubuntu Ubuntu系统启动过程中 输入用户名与密码后登录一直卡在紫色界面问题 未解决 最后通过重装系统 2
  • React笔记(八)Redux

    一 安装和配置 React 官方并没有提供对应的状态机插件 因此 我们需要下载第三方的状态机插件 Redux 1 下载Redux 在终端中定位到项目根目录 然后执行以下命令下载 Redux npm i redux 2 创建配置文件 在 Re
  • js中包含中文注释引起的错误

    在一个js文件中有如下代码块 显示某块function MissBlock theid 在 aspx中引用该文件 执行页面时提示脚本错误 很长时间调试之后 发现与函数前的中文注释有关 把注释去掉或改成英文就OK了估计跟页面的编码设置有关 特
  • Linux内核-漫画

    学习的过程中发现了这个有意思的漫画 于是简单翻译了一下 原图 翻译
  • Springboot中使用策略模式+工厂模式

    策略模式和工厂模式相信大家都比较熟悉 但是大家有没有在springboot中实现策略和工厂模式 具体策略模式和工厂模式的UML我就不给出来了 使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE 接下来咱们直接实现 项