将一种模型转换为另一种模型的设计模式

问题描述 投票:0回答:6

基本上,我的应用程序中有许多对象,我必须在发送请求之前将它们转换为另一个第三方对象。收到响应后,我必须将这些对象转换回我的应用程序支持的对象。

我可以使用什么模式将一个模型对象转换为 Java 中的另一个模型对象?

java design-patterns
6个回答
9
投票

我不认为有一个特定的模式,但你只需要一个“转换器”或“翻译器”类,它接受一个对象并返回另一个对象:

MyObject convert(ThirdPartyObject obj);
ThirdPartyObject convert(MyObject obj);

5
投票

适配器或外观模式应该可以解决您的问题:

适配器: http://www.youtube.com/watch?v=TriX8OiEhOU

立面: http://www.youtube.com/watch?v=WLjvNpP6yeQ


5
投票

AdapterFacade 是结构模式。您没有任何模式来满足对象转换

在创建模式方面,Builder是你能想到的一种模式。

通常使用 Builder 模式来构建带有强制参数和可选参数的对象。但您可以通过构建必要的对象来对其进行微调。

你也可以无模式地解决问题。您可以使用对象组合编写自己的方法来转换对象

查看相关的 SE 问题和代码示例:

如何在Java中修剪对象的某些字段?


1
投票

您可能正在寻找适配器模式:http://en.wikipedia.org/wiki/Adapter_pattern


1
投票

确定对象的上下文有点困难,但看一下汇编器模式,尽管从技术上讲不是一种设计模式。 Assembler 类用于从一个对象映射到另一个对象,特别是当一个对象是 DTO(类似于响应对象)到域对象时。 Dozer 框架可以帮助您完成一些繁琐的转换。


0
投票

正如已经说过的,本身不存在转换模式。有一些方法可以帮助解决这个问题。

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
方法),它就特别有用建设者)。 缺点是需要更多的编码和额外的类。

您还可以在工厂中进行转换而不使用构建器 - 如果对象足够简单但您不想在它们之间创建依赖关系。当然还有其他可能的方法来解决这个问题,但这些是我见过最常使用的方法。

© www.soinside.com 2019 - 2024. All rights reserved.