Java设计模式用于将相同输入的不同变体转换为公共输出



我有一个场景,其中有一个服务聚合器,例如skyscanner、皮划艇或谷歌航班。如果你看到了,他们都会询问基本的详细信息,比如来源、目的地、日期和乘客人数,一旦你从特定的服务提供商那里选择了航班,比如expedia,你就会被重定向到expedia上,并通过服务聚合器发送预填的详细信息

现在,从源系统发送的参数的名称可能会有所不同,在目的地,我们必须将其转换为相同的POJO。

我想到的一个选项是Factory模式,基于通道,我将返回一个对象,该对象将把源参数转换为通用POJO。

我觉得类似的另一种设计模式是策略设计模式,即基于上下文创建ExtractionStrategy

有没有其他合适的设计模式来解决这个问题?

IMHO尽可能简化实现,我建议您使用简单的工厂模式。定义一个工厂服务,只执行两个操作:

  1. 获取所有参数的指定Map,如source、dest。日期等
  2. 现在有一个简单的方法transformModel(Map,SourceAgg Type(

定义一个具有POJO公共字段的父类(比如BasePOJO(,然后扩展所有其他类型的源聚合器POJO(假设所有POJO都有不同的字段名等(。自从你的每一个源agg。类将有自己的逻辑来创建特定于该类型的源聚合器的POJO。

链接每个源类impl。维护一个枚举:(sourceType,sourceAggClass(

例如:

枚举源Agg{(EXPEDIA、ExpediaModelImpl(,(VIA,ViaModelImpl(;}

您所要做的就是从枚举中获得基于源聚合器键(比如EXPEDIA(的实现,因为您在上下文中有bean名称,所以可以很容易地为每种类型调用transformModel函数。transformModel从每个源agg返回的对象。类将是BasePOJO类型,因此很容易作为形式化参数处理。

在未来,如果你想添加新的源聚合器,你所要做的就是编写该类的转换模型并添加枚举映射,就这样!

附言:这是我对SO的第二个回答,欢迎提出建议。

最新更新