SpringBoot+策略模式实现多种文件存储模式
一、策略模式
背景
针对某种业务可能存在多种实现方式;传统方式是通过传统if…else…或者switch代码判断;
弊端:
- 代码可读性差
- 扩展性差
- 难以维护
策略模式简介
策略模式是一种行为型模式,它将对象和行为分开,将行为定义为一个行为接口和具体行为的实现。
组成:
- 抽象策略类(Strategy):策略的抽象;
- 具体策略类(ConcreteStrategy):具体的策略实现,一种具体实现;
- 环境类(Context):用来操作策略的上下文环境;
二、代码实现
以文件存储方式为例
抽象策略类
package com.qiangesoft.file.core;import org.springframework.web.multipart.MultipartFile;/*** 文件存储策略接口** @author qiangesoft* @date 2024-01-06*/
public interface FileStoreStrategy {/*** 存储方式** @return*/String getType();/*** 上传文件** @param file* @return* @throws Exception*/void uploadFile(MultipartFile file) throws Exception;
}
具体策略实现
本地存储
package com.qiangesoft.file.core.local;import com.qiangesoft.file.core.FileStoreStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;/*** 文件本地存储** @author qiangesoft* @date 2024-01-06*/
@Component
@Slf4j
public class LocalStoreStrategyImpl implements FileStoreStrategy {@Overridepublic String getType() {return "LOCAL";}@Overridepublic void uploadFile(MultipartFile file) throws Exception {log.info("upload file by local");}
}
minio存储
package com.qiangesoft.file.core.minio;import com.qiangesoft.file.core.FileStoreStrategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;/*** 文件minio对象存储** @author qiangesoft* @date 2024-01-06*/
@Component
@Slf4j
public class MinioStoreStrategyImpl implements FileStoreStrategy {@Overridepublic String getType() {return "MINIO";}@Overridepublic void uploadFile(MultipartFile file) throws Exception {log.info("upload file by minio");}
}
策略上下文环境
package com.qiangesoft.file.core;import org.springframework.stereotype.Component;import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 文件存储策略上下文** @author qiangesoft* @date 2024-01-06*/
@Component
public class FileStoreStrategyContext {/*** 策略实现类上下文*/private final Map<String, FileStoreStrategy> strategyMap = new ConcurrentHashMap<>();/*** 利用Spring的发现机制,将实现了FileStoreStrategy的类都放到strategyMap里面*/public FileStoreStrategyContext(List<FileStoreStrategy> fileStoreStrategyList) {for (FileStoreStrategy strategy : fileStoreStrategyList) {String type = strategy.getType();if (this.strategyMap.containsKey(type)) {throw new RuntimeException(String.format("Strategy [%s] is repeat!", type));}this.strategyMap.put(type, strategy);}}/*** 获取具体的策略实现类** @param storeType* @return*/public FileStoreStrategy getStrategy(String storeType) {FileStoreStrategy strategy = strategyMap.get(storeType);if (strategy == null) {throw new RuntimeException(String.format("Strategy [%s] is not found!", storeType));}return strategy;}
}
调用
package com.qiangesoft.file.demo;import com.qiangesoft.file.core.FileStoreStrategy;
import com.qiangesoft.file.core.FileStoreStrategyContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Demo** @author qiangesoft* @date 2024-01-08*/
@RestController
@RequestMapping("/demo")
public class DemoController {@Autowiredprivate FileStoreStrategyContext fileStoreStrategyContext;@GetMapping("/upload")public String upload(String type) throws Exception {FileStoreStrategy fileStoreStrategy = fileStoreStrategyContext.getStrategy(type);fileStoreStrategy.uploadFile(null);return fileStoreStrategy.getType();}}



扩展
如果新增一种存储方式,只需增加一个策略实现类,实现FileStoreStrategy接口,重写getType方法,然后再实现具体的业务逻辑;
案例代码
点击下载
相关文章:
SpringBoot+策略模式实现多种文件存储模式
一、策略模式 背景 针对某种业务可能存在多种实现方式;传统方式是通过传统if…else…或者switch代码判断; 弊端: 代码可读性差扩展性差难以维护 策略模式简介 策略模式是一种行为型模式,它将对象和行为分开,将行…...
细说DMD芯片信号-DLP3
1, Block diagram 2. 信号介绍 2.1, LS interface: LD_Data_P/N(i), LD_CLK_P/N(i), LS_RDATA_A_BIST(O) 2.2, 视频信号: HSSI(High speed serial interface) High speed Differential Data pair lan A0~7 P/N, High speed Differential Clock A High…...
MySQL从0到1全教程【1】MySQL数据库的基本概念以及MySQL8.0版本的部署
1 MySQL数据库的相关概念 1.1 数据库中的专业术语 1.1.1 数据库 (DB) 数据库是指:保存有组织的数据的容器(通常是一个文数据库 (database)件或一组文件)。 1.1.2 数据库管理系统 (DBMS) 数据库管理系统(DBMS)又称为数据库软件(产品),用于管理DB中的数据 注意:…...
grep常用命令
1. grep常用参数 -i忽略大小写-w精准匹配整词-v结果取反(匹配指定的字符串以外的内容)-A关键字所在行的后几行也一起显示-B关键字所在行的前几行也一起显示-C关键字所在行的前后几行行一起显示 2. 常用命令 2.1 从文件中查找关键词 # 精准匹配 grep linux test.txt# 从多个…...
Spring Data JPA 使用总结
本文记录了Spring data JPA 的一些细碎的规则。 findBy语法规则 :findOOXXByName 实际上等价 > findByName 比如: User findFirstByOrderByLastnameAsc();User findTopByOrderByAgeDesc();Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);…...
融云 CEO 董晗荣获 51CTO 「2023 年度科技影响力人物奖」
(👆点击获取《社交泛娱乐出海作战地图》) 1 月 5 日,由知名 IT 技术媒体 51CTO 主办的第十八届“中国企业年终评选”正式揭晓榜单,融云 CEO 董晗荣获“2023 年度科技影响力人物奖”。关注【融云全球互联网通信云】了解…...
数据洞察力,驱动企业财务变革
我们不得不面对一个现实,就是数据量的剧增。加上大部分企业并不愿意删除历史数据,以防未来预测分析时需要,这造成数据就像一个雪球,越滚越大。然而,过多的数据和数据不足一样会成为企业发展和理解分析的障碍。从海量数…...
Postgresql常见(花式)操作完全示例
案例说明 将Excel数据导入Postgresql,并实现常见统计(数据示例如下) 导入Excel数据到数据库 使用Navicat工具连接数据库,使用导入功能可直接导入,此处不做过多介绍,详细操作请看下图: 点击“下…...
【Docker】数据管理
🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 前言 一.数据卷 示例演示 示例剖析…...
认识异常及异常处理机制之try-catch
异常类 什么是异常?就像人会犯错一样,程序在运行的过程中也会犯错。程序中的错误有两类,一类称为Error(错误),另一类称为Exception(异常)。Error类和Exception类都为Throwable的子类…...
html学习之路:简述html文档头部 <meta> 的 http-equiv 属性
🧋当输入网址打开网页时,设置html头部meta的http-equiv属性,可以帮助浏览器更加精确和正常却的显示网页内容,比如设置网页多久自动刷新,设置网页在浏览器缓存中的时限,设置多少事件跳转到指定的网页地址&am…...
逆矩阵计算
目录 一、逆矩阵的定义 核心:AB BA E 1)定义 2)注意 3)逆矩阵存在的条件|A| ! 0 二、核心公式: 三、求逆矩阵(核心考点) 1、伴随矩阵法 2、初等变换法(重点掌握ÿ…...
《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗
《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗 一部赓续红色血脉的生动教材 一部讴歌时代英雄和人民精神宝典 当历史的烽烟渐渐远去,留下的是一页页泛黄的记忆和无数英雄的壮丽诗篇。李传铭的力作《豫鄂烽火燎原大小焕岭》正是这样一部深情的回望&am…...
浅研究下 DHCP 和 chrony
服务程序: 1.如果有默认配置,请先备份,再进行修改 2.修改完配置文件,请重启服务或重新加载配置文件,否则不生效 有些软件,安装包的名字和系统里服务程序的名字不一样(安装包名字:…...
【算法】动态中位数(对顶堆)
题目 依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。 输入格式 第一行输入一个整数 P,代表后面数据集的个数,接下来若干行输入各个数据集。 每个数据集的第一行首先输入一个代表…...
mysql服务多实例运行
1、官网下载mysql安装包 https://downloads.mysql.com/archives/community/ 2、解压安装包 tar -zxvf mysql-8.1.0-linux-glibc2.28-aarch64.tar.xz -C /usr/localmv /usr/local/mysql-8.1.0-linux-glibc2.28-aarch64 /usr/local/mysql 3、创建mysql用户组 groupadd…...
「HDLBits题解」Module fadd
本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接:Module fadd - HDLBits module top_module (input [31:0] a,input [31:0] b,output [31:0] sum );//wire [15:0] t1, t2 ; wire co…...
微软等开源评估ChatGPT、Phi、Llma等,统一测试平台
微软亚洲研究院、中国科学院自动化研究所、中国科学技术大学和卡内基梅隆大学联合开源了,用于评估、分析大语言模型的统一测试平台——PromptBench。 Prompt Bench支持目前主流的开源、闭源大语言模型,例如,ChatGPT、GPT-4、Phi、Llma1/2、G…...
DDNS-GO配置使用教程
环境:openwrt 下载地址:Releases jeessy2/ddns-go GitHub 下载 ssh至openwrt根目录,根据你的处理器选择要下载的版本,我是路由器,选择的是 ddns-go_5.7.1_linux_arm64.tar.gz wget github链接 安装 tar -zxvf…...
flex弹性盒子常用的布局属性详解
想必大家在开发中经常会用到flex布局。而且还会经常用到 justify-content 属性实现分栏等等 接下来给大家分别讲一下 justify-content 的属性值。 以下是我敲的效果图大家可以清晰看出区别 space-between 属性值可以就是说两端对齐 space-evenly 属性值是每个盒子之间的…...
YOLOv10镜像作品集:高清图像目标检测惊艳案例分享
YOLOv10镜像作品集:高清图像目标检测惊艳案例分享 1. 引言:YOLOv10带来的视觉革命 在计算机视觉领域,目标检测技术正经历着前所未有的变革。YOLOv10作为最新一代的目标检测模型,以其无与伦比的速度和精度重新定义了实时检测的标…...
如何用XHS-Downloader解决内容采集难题?3大维度提升效率90%
如何用XHS-Downloader解决内容采集难题?3大维度提升效率90% 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接…...
『NAS』在绿联部署One API,统一管理你的所有大模型服务
点赞 关注 收藏 学会了 💡整理了一个 NAS 专属玩法专栏,感兴趣的工友可以戳这里关注 👉 《NAS邪修》 One API 是一个开源的接口管理与分发系统,它能将各种大模型的非标接口(如 DeepSeek、Kimi、LongCat 等ÿ…...
从零搭建无人船:两年实战后,我总结的ArduPilot+Pixhawk避坑全流程
从零搭建无人船:两年实战后,我总结的ArduPilotPixhawk避坑全流程 第一次把无人船放进水里时,GPS信号突然丢失,船体在河中央失控打转——这个惊心动魄的瞬间让我意识到,开源飞控的实战应用远不是下载代码、连接硬件那么…...
Pixel Aurora Engine实战落地:为像素RPG自动生成NPC对话头像与场景贴图
Pixel Aurora Engine实战落地:为像素RPG自动生成NPC对话头像与场景贴图 1. 像素游戏开发者的新利器 想象一下这样的场景:你正在开发一款像素风格的RPG游戏,需要为上百个NPC设计独特的对话头像,还要制作大量场景贴图。传统方法下…...
AI读脸术备份恢复指南:手把手教你搭建高可用人脸识别服务
AI读脸术备份恢复指南:手把手教你搭建高可用人脸识别服务 1. 项目背景与需求分析 人脸识别技术已经成为现代数字服务的重要组成部分,从电商个性化推荐到智能安防系统,都依赖这项技术的稳定运行。AI读脸术镜像基于OpenCV DNN深度神经网络构建…...
崖山数据库-谓词没提前过滤优化器BUG
数据库版本崖山23.5.1 SQL> select * from v$version;BANNER VERSION_NUMBER ---------------------------------------------------------------- ----------------- Enterprise Edition Release 23.5.1.1…...
操作系统-lazy allocation
只有真正需要使用这些页的时候,才进行物理内存页的实际分配sbrk()在xv6操作系统中,进程的用户内存布局由代码段(text)、数据段(data)、堆区(heap)和栈区(stack)组成。sbrk()主要修改的是堆区的大小,堆在xv6中由低地址向高地址拓展。当程序调用sbrk(n)时,操作系统内核…...
AMD显卡专属优化:Ollama-for-amd本地大模型部署终极指南
AMD显卡专属优化:Ollama-for-amd本地大模型部署终极指南 【免费下载链接】ollama-for-amd Get up and running with Llama 3, Mistral, Gemma, and other large language models.by adding more amd gpu support. 项目地址: https://gitcode.com/gh_mirrors/ol/ol…...
PyTorch 2.8镜像一文详解:xFormers+Accelerate+Diffusers全栈预装环境实测
PyTorch 2.8镜像一文详解:xFormersAccelerateDiffusers全栈预装环境实测 1. 镜像概述与核心优势 PyTorch 2.8深度学习镜像是一个经过深度优化的全栈AI开发环境,专为现代深度学习任务设计。这个镜像最显著的特点是开箱即用的完整工具链支持,…...
