【问题标题】:Design pattern for converting one model to another将一种模型转换为另一种模型的设计模式
【发布时间】:2021-04-15 14:07:51
【问题描述】:

我正在用 java 编写一个库,我需要将一个模型转换(映射)到另一个模型,反之亦然。我所做的是实现一个具有 2 个泛型类型的抽象转换器类,包含 convertTo 和 convertFrom 方法,并从中扩展了我的转换器。

public abstract class TypeConverter<MyType, OtherLibType> {
    private final Function<MyType, OtherLibType> fromMyType;
    private final Function<OtherLibType, MyType> fromOtherLibType;

    public TypeConverter(final Function<MyType, OtherLibType> fromMyType,
                         final Function<OtherLibType, MyType> fromOtherLibType
    ) {
        this.fromMyType = fromMyType;
        this.fromOtherLibType = fromOtherLibType;
    }

    public final OtherLibType convertFromMyType(final MyType myType) {
        return fromMyType.apply(myType);
    }

    public final MyType convertFromJspritType(final OtherLibType otherLibType) {
        return fromOtherLibType.apply(otherLibType);
    }

}

但对于特定的实现,我可能还需要其他对象进行转换,我不知道实现这些东西的最佳实践是什么。我考虑过适配器和外观,但它们似乎不符合我的要求。有没有我可以使用的设计模式?提前谢谢你。

【问题讨论】:

  • 我认为你真的应该把它声明为一个接口Converter&lt;T,R&gt;。我也不清楚为什么它是抽象的,因为它似乎做了所有它应该做的事情,因为它有两个功能,所以它应该直接实现那个接口。
  • 看起来你可能正在尝试和MapStruct做同样的事情。

标签: java design-patterns


【解决方案1】:

我觉得应该是这样的界面

interface Converter<T, R> {
 R convertTo(T source, R target);
 T convertFrom(R source, T target);
}

你的抽象类不需要是抽象的,直接通过调用Functions来实现这个接口。

然后你可以有一个包装器,它也实现该接口并将其调用委托给包装的实现。

class ConverterWrapper<T, I, R> implements Converter<T, R> {
 private Converter<T, I> toIntermediate;
 private Converter<I, R> toResult;

 // add trivial constructor to initialize the fields

 public R convertTo(T source) {
  I intermediate = toIntermediate.convertTo(source);
  return toResult.convert(intermediate);
 }
 public T convertFrom(R source) {
  I intermediate = toResult.convertFrom(source);
  return toIntermediate.convertFrom(intermediate);
 }
}

【讨论】:

  • 谢谢!但是我需要在转换中使用的对象呢,我如何从外部传递这些值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多