当前位置: 首页 > news >正文

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+策略模式实现多种文件存储模式

一、策略模式 背景 针对某种业务可能存在多种实现方式&#xff1b;传统方式是通过传统if…else…或者switch代码判断&#xff1b; 弊端&#xff1a; 代码可读性差扩展性差难以维护 策略模式简介 策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行…...

细说DMD芯片信号-DLP3

1&#xff0c; Block diagram 2. 信号介绍 2.1, LS interface&#xff1a; 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)又称为数据库软件(产品)&#xff0c;用于管理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 年度科技影响力人物奖」

&#xff08;&#x1f446;点击获取《社交泛娱乐出海作战地图》&#xff09; 1 月 5 日&#xff0c;由知名 IT 技术媒体 51CTO 主办的第十八届“中国企业年终评选”正式揭晓榜单&#xff0c;融云 CEO 董晗荣获“2023 年度科技影响力人物奖”。关注【融云全球互联网通信云】了解…...

数据洞察力,驱动企业财务变革

我们不得不面对一个现实&#xff0c;就是数据量的剧增。加上大部分企业并不愿意删除历史数据&#xff0c;以防未来预测分析时需要&#xff0c;这造成数据就像一个雪球&#xff0c;越滚越大。然而&#xff0c;过多的数据和数据不足一样会成为企业发展和理解分析的障碍。从海量数…...

Postgresql常见(花式)操作完全示例

案例说明 将Excel数据导入Postgresql&#xff0c;并实现常见统计&#xff08;数据示例如下&#xff09; 导入Excel数据到数据库 使用Navicat工具连接数据库&#xff0c;使用导入功能可直接导入&#xff0c;此处不做过多介绍&#xff0c;详细操作请看下图&#xff1a; 点击“下…...

【Docker】数据管理

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 一.数据卷 示例演示 示例剖析…...

认识异常及异常处理机制之try-catch

异常类 什么是异常&#xff1f;就像人会犯错一样&#xff0c;程序在运行的过程中也会犯错。程序中的错误有两类&#xff0c;一类称为Error&#xff08;错误&#xff09;&#xff0c;另一类称为Exception&#xff08;异常&#xff09;。Error类和Exception类都为Throwable的子类…...

html学习之路:简述html文档头部 <meta> 的 http-equiv 属性

&#x1f9cb;当输入网址打开网页时&#xff0c;设置html头部meta的http-equiv属性&#xff0c;可以帮助浏览器更加精确和正常却的显示网页内容&#xff0c;比如设置网页多久自动刷新&#xff0c;设置网页在浏览器缓存中的时限&#xff0c;设置多少事件跳转到指定的网页地址&am…...

逆矩阵计算

目录 一、逆矩阵的定义 核心&#xff1a;AB BA E 1&#xff09;定义 2&#xff09;注意 3&#xff09;逆矩阵存在的条件|A| ! 0 二、核心公式&#xff1a; 三、求逆矩阵&#xff08;核心考点&#xff09; 1、伴随矩阵法 2、初等变换法&#xff08;重点掌握&#xff…...

《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗

《豫鄂烽火燎原大小焕岭》&#xff1a;一部穿越时空的历史史诗 一部赓续红色血脉的生动教材 一部讴歌时代英雄和人民精神宝典 当历史的烽烟渐渐远去&#xff0c;留下的是一页页泛黄的记忆和无数英雄的壮丽诗篇。李传铭的力作《豫鄂烽火燎原大小焕岭》正是这样一部深情的回望&am…...

浅研究下 DHCP 和 chrony

服务程序&#xff1a; 1.如果有默认配置&#xff0c;请先备份&#xff0c;再进行修改 2.修改完配置文件&#xff0c;请重启服务或重新加载配置文件&#xff0c;否则不生效 有些软件&#xff0c;安装包的名字和系统里服务程序的名字不一样&#xff08;安装包名字&#xff1a;…...

【算法】动态中位数(对顶堆)

题目 依次读入一个整数序列&#xff0c;每当已经读入的整数个数为奇数时&#xff0c;输出已读入的整数构成的序列的中位数。 输入格式 第一行输入一个整数 P&#xff0c;代表后面数据集的个数&#xff0c;接下来若干行输入各个数据集。 每个数据集的第一行首先输入一个代表…...

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代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接&#xff1a;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等,统一测试平台

微软亚洲研究院、中国科学院自动化研究所、中国科学技术大学和卡内基梅隆大学联合开源了&#xff0c;用于评估、分析大语言模型的统一测试平台——PromptBench。 Prompt Bench支持目前主流的开源、闭源大语言模型&#xff0c;例如&#xff0c;ChatGPT、GPT-4、Phi、Llma1/2、G…...

DDNS-GO配置使用教程

环境&#xff1a;openwrt 下载地址&#xff1a;Releases jeessy2/ddns-go GitHub 下载 ssh至openwrt根目录&#xff0c;根据你的处理器选择要下载的版本&#xff0c;我是路由器&#xff0c;选择的是 ddns-go_5.7.1_linux_arm64.tar.gz wget github链接 安装 tar -zxvf…...

flex弹性盒子常用的布局属性详解

想必大家在开发中经常会用到flex布局。而且还会经常用到 justify-content 属性实现分栏等等 接下来给大家分别讲一下 justify-content 的属性值。 以下是我敲的效果图大家可以清晰看出区别 space-between 属性值可以就是说两端对齐 space-evenly 属性值是每个盒子之间的…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...