java - 在 Spring Boot 中使用哪种设计模式来迭代请求属性
问题描述
我需要将请求实体保存到多个数据源中。我的请求可以有一个或多个请求对象,它们应该保存在各自的数据库中。哪种设计模式适合需求?
HTTP 请求
{
"params" : [
{
"id": "AB",
"data": //some object
},
{
"id": "CD",
"data": //some object
},
{
"id": "EF",
"data": //some object
},
{
"id": "GH",
"data": //some object
},
{
"id": "IJ",
"data": //some object
},
...........
...........
]
}
AB & CD - 到 ORACLE 实例 1
EF & GH - 到 ORACLE 实例 2
IJ - 到 MYSQL
在这里我知道应该将哪个对象保存在哪个数据库中。我不想遍历params
数组并创建多个小数组,除非这是唯一的选择。我正在寻找一种设计模式来解决这个目的,有人可以建议吗?
解决方案
在这种情况下,我认为最好的设计模式是[Factory method pattern][1]。实际上,您将通过客户端数据创建适当的对象。我的意思是根据id值,相关服务将调用以将数据保存到相应的数据库中。
假设您将有一个用于保存具有不同实现的数据的接口。
public interface IService {
void save(Data data);
List<String> types();
}
他们的实现是这样的:
@Service
class OracleInstance1 implements IService {
void save(Data data){}
List<String> types(){return List.of("AB","CD");}
}
对于mysql 实例:
@Service
class MysqlInstance implements IService {
void save(Data date){}
List<String> types(){return List.of("IJ");}
}
现在您需要一个工厂方法来创建基于数据输入的相关对象。( id ) 用于创建工厂方法我创建一个具有ServiceHolder名称的新服务。在这个类中,所有基础服务的实现都将使用。因为你使用spring框架,它会很容易做到。只需通过自动连接列表即可。
@Service
class ServiceHolder{
@Autowired
List<IService> allService;
public IService getByType(String type){
return allService.stream()
.filter(s->s.getTypes().contains(type))
.findFirst().orElse(null);
}
}
现在通过执行此服务并循环访问数据条目,您可以将其保存在自己的数据库中。
for(MyParam param: params){
serviceHolder.getByType(param.getId()).save(param.getData());
}
通过使用getByType方法,您可以为每个数据条目找到合适的服务,并调用save方法插入数据库。[1]:https ://en.wikipedia.org/wiki/Factory_method_pattern
推荐阅读
- reactjs - React - 从 api 获取数据并渲染它的步骤是什么?
- java - 通过改造从数据库中获取 xAxis mpchart android
- python - 我可以从 macOS 卸载 python2 吗?
- vsto - 如何通过文本字段在 Excel VSTO 加载项中将图表目标位置作为用户的输入?
- python - 贝宝 SDK 集成中的浏览器内容安全策略问题
- reactjs - 将 mapDispatchToProps 作为对象或函数传递以进行连接具有相同的结果
- logback - 识别和启用库日志记录的方法是什么(对于类和根级别)
- c++ - 使用 OMP 进行多个 Eigen::Matrix 初始化:分段错误
- php - 使用 Laravel 下载功能下载文件
- javascript - JavaScript:多行选择