首页 > 解决方案 > 在 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数组并创建多个小数组,除非这是唯一的选择。我正在寻找一种设计模式来解决这个目的,有人可以建议吗?

标签: javaspringspring-bootjava-8

解决方案


在这种情况下,我认为最好的设计模式是[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


推荐阅读