当前位置: 首页 > 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方法,然后再实现具体的业务逻辑;

案例代码

点击下载

http://www.lryc.cn/news/278827.html

相关文章:

  • 细说DMD芯片信号-DLP3
  • MySQL从0到1全教程【1】MySQL数据库的基本概念以及MySQL8.0版本的部署
  • grep常用命令
  • Spring Data JPA 使用总结
  • 融云 CEO 董晗荣获 51CTO 「2023 年度科技影响力人物奖」
  • 数据洞察力,驱动企业财务变革
  • Postgresql常见(花式)操作完全示例
  • 【Docker】数据管理
  • 认识异常及异常处理机制之try-catch
  • html学习之路:简述html文档头部 <meta> 的 http-equiv 属性
  • 逆矩阵计算
  • 《豫鄂烽火燎原大小焕岭》:一部穿越时空的历史史诗
  • 浅研究下 DHCP 和 chrony
  • 【算法】动态中位数(对顶堆)
  • mysql服务多实例运行
  • 「HDLBits题解」Module fadd
  • 微软等开源评估ChatGPT、Phi、Llma等,统一测试平台
  • DDNS-GO配置使用教程
  • flex弹性盒子常用的布局属性详解
  • 2023年Gartner® DevOps平台魔力象限发布,Atlassian被评为“领导者”
  • kylin集群使用nginx反向代理
  • 小红书搜索团队提出全新框架:验证负样本对大模型蒸馏的价值
  • 汽车销售领域相关专业术语
  • 代币合约 ERC20 Token接口
  • 判断回文字符串—C语言
  • 如何在Docker本地搭建流程图绘制神器draw.io并实现公网远程访问
  • Web前端篇——el-timeline+el-scrollbar时间轴数据刷新后自动显示滚动条
  • Flutter 监听前台和后台切换的状态
  • 图解Kubernetes的服务(Service)
  • facebook广告素材制作要注意哪些