基本上,我的应用程序中有许多对象,我必须在发送请求之前将它们转换为另一个第三方对象。收到响应后,我必须将这些对象转换回我的应用程序支持的对象。
我可以使用什么模式将一个模型对象转换为 Java 中的另一个模型对象?
我不认为有一个特定的模式,但你只需要一个“转换器”或“翻译器”类,它接受一个对象并返回另一个对象:
MyObject convert(ThirdPartyObject obj);
ThirdPartyObject convert(MyObject obj);
适配器或外观模式应该可以解决您的问题:
Adapter 和 Facade 是结构模式。您没有任何模式来满足对象转换。
在创建模式方面,Builder是你能想到的一种模式。
通常使用 Builder 模式来构建带有强制参数和可选参数的对象。但您可以通过构建必要的对象来对其进行微调。
你也可以无模式地解决问题。您可以使用对象组合或编写自己的方法来转换对象。
查看相关的 SE 问题和代码示例:
您可能正在寻找适配器模式:http://en.wikipedia.org/wiki/Adapter_pattern
确定对象的上下文有点困难,但看一下汇编器模式,尽管从技术上讲不是一种设计模式。 Assembler 类用于从一个对象映射到另一个对象,特别是当一个对象是 DTO(类似于响应对象)到域对象时。 Dozer 框架可以帮助您完成一些繁琐的转换。
正如已经说过的,本身不存在转换模式。有一些方法可以帮助解决这个问题。
1。构造者
为
DestinationType
创建一个构造函数,它采用源对象的实例。
public class DestinationType
{
public DestinationType(SourceType sourceObj)
{
PropertyA = sourceObj.Property1;
PropertyB = sourceObj.Property2;
}
}
var destinationObj = new DestinationType(sourceObj);
这会创建
DestinationType
对 SourceType
的依赖性。
2。换算方法
在
SourceType
中创建转换方法。
public class SourceType
{
public DestinationType ToDestinationType()
{
var destinationObj = new DestinationType();
destinationObj.Property1 = PropertyA;
destinationObj.Property2 = PropertyB;
return destinationObj;
}
}
这会创建
SourceType
对 DestinationType
的依赖性。
3。结合构建器和工厂模式
由于前两个解决方案通常适用于更简单的转换,因此如果您获得一些更复杂的对象,您可能需要为其创建一个构建器。构建器通常只接受每个一组方法的一个属性值。您可以通过
DestinationType
的工厂来克服这个问题,该工厂将采用 SourceType
对象并在内部使用构建器。
构建器类
public class DestinationTypeBuilder()
{
private readonly DestinationType _destinationObj;
public DestinationTypeBuilder()
{
_destinationObj = new DestinationType();
}
public void Reset()
{
_destinationObj = null;
}
public DestinationType Build()
{
var destinationObj = _destinationObj;
Reset();
return destinationObj;
}
public DestinationTypeBuilder SetProperty1(TypeOfProp1 value1)
{
_destinationObj.Property1 = value1;
return this;
}
public DestinationTypeBuilder SetProperty2(TypeOfProp1 value2)
{
_destinationObj.Property2 = value2;
return this;
}
}
工厂类
public class DestinationTypeFactory()
{
public DestinationType Create(SourceType sourceObj)
{
var builder = new DestinationTypeBuilder();
return builder
.SetProperty1(sourceObj.PropertyA)
.SetProperty2(sourceObj.PropertyB)
.Build();
}
}
此方法不会为操作中涉及的两个对象创建任何依赖关系,如果您需要将各种类型转换为相同的
DestinationType
对象(您只需编写更多采用不同输入但利用相同的 Create
方法),它就特别有用建设者)。
缺点是需要更多的编码和额外的类。
您还可以在工厂中进行转换而不使用构建器 - 如果对象足够简单但您不想在它们之间创建依赖关系。当然还有其他可能的方法来解决这个问题,但这些是我见过最常使用的方法。