gpt4 book ai didi

java - 转换 Java 对象的最佳实践/模式

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:05:48 25 4
gpt4 key购买 nike

假设我有一个应用程序负责获取供应商消息并将其转换为规范消息。例如:

public class MessageA extends VendorMessage { ... }
public class MessageB extends VendorMessage { ... }

public class MessageX extends CanonicalMessage { ... }
public class MessageY extends CanonicalMessage { ... }

MessageA 映射到 MessageX,MessageB 映射到 MessageY。

我的方法是为每种消息类型设置一个转换器类来处理这种转换。在这个例子中,我会有以下转换器:

public class MessageXTransfomer()
{
public MessageX transform(MessageA message) {...}
}

public class MessageYTransfomer()
{
public MessageY transform(MessageB message) {...}
}

我的问题实际上是我最终调用转换器的方式。

由于我的流程将一些 VendorMessage 作为输入,我需要询问类型,以便我知道将其定向到哪个特定转换器。例如,一种方法可能如下所示:

public class TransfomerService
{
MessageXTransformer messageXTransformer = new MessageXTransformer();
MessageYTransformer messageYTransformer = new MessageYTransformer();

public CanonicalMessage transform(VendorMessage message)
{
if (message instanceOf MessageA)
{
return messageXTransformer.transform((MessageA) message);
}
else if (message instanceOf MessageB)
{
return messageYTransformer.transform((MessageB) message);
}
}
}

我不确定为什么,但我觉得这种方法很奇怪 - 好像我做错了什么。是否有我应该使用的此类问题的最佳实践?

注意:我正在寻找不使用任何转换框架等的最佳方法。理想情况下,仅使用基本 Java 即可实现该模式。

最佳答案

我喜欢@javaguy 的回答,但它并不完整。当然,如果您可以像他后面的示例中那样使用特定的转换器,那就太好了,但如果您不能,则必须坚持使用 TransformerFacade 和一种 StrategyPattern:

public class TransformerFacade {

private Map<Class, VendorMessageToCanonicalMessageTransformer> transformers = new HashMap<>();
{
// this is like strategies, the key may be class, class name, enum value, whatever
transformers.put(MessageA.class, new MessageXTransformer());
transformers.put(MessageB.class, new MessageYTransformer());
}

public CanonicalMessage transform(VendorMessage message) {
return transformers.get(message.getClass()).transform(message);
}
}

关于java - 转换 Java 对象的最佳实践/模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40390903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com