0

我正在尝试在 java 中实现不同类型之间的转换器:我有一个超类 foo,它有 2 个子类:foo1 和 foo2,我还有 2 个不相关的其他类 bar1 和 bar2,我正在尝试从bar1 到 foo1 以及从 bar2 到 foo2(反之亦然)。

因为我在这里有继承,所以我认为应该创建一个具有泛型类型(将是 bar1 或 bar2)的接口,它将定义发生转换所需的函数,我还希望转换器成为两者的通用转换器bar1 和 bar2,我在想它应该以某种方式使用接口实现。将不胜感激对此类实施示例的更好想法或参考。我也在寻找一种描述这种方案的设计模式,但可以找到合适的......有什么想法吗?

4

2 回答 2

1

适配器是用于将一种类型转换为另一种类型的设计模式http://en.wikipedia.org/wiki/Adapter_design_pattern

从其他对象创建新对象将是“原型”。

或者简单地使用“工厂”或“构建器”创建新实例。

于 2013-06-14T10:02:06.730 回答
1

我会选择一个通用接口和一个通用父类,并且可能还使用构建器模式……;

a common partialFooBar interface
a common fooBarChimera parent class

然后,您可能会将您的转换器放入 fooBarChimera 父级(并强制执行所需的额外细节以完成您想要的任何一个。

您可能还想使用构建器模式。

让它充实一点……

即第一堂课

partialFooBarBuilder

有一个简单的默认构造函数和设置方法。

最后一个方法会将这个类“转换”为“完整”版本,或 fooBarChimera,然后只需要在其中包含“getter”方法。

正确的版本仅可从此构建器类(或 fooBarChimera)中获得,因此您可以在返回最终正确的 foo 类之前更轻松地强制内容处于良好状态(如果它被链接,您可以通过一些很好的错误处理来做到这一点到您的用户界面)。

所以你最终会得到类似...

public class buildpartFooBar implement fooBarCommon{
//fooBarCommon is the interface the enforces the commonality of between the 2 objects.    

public buildPartFooBar(){...}

...[various setter methods here ....]

//make the different types of object we may become
private foo1 makeFoo1(iNeedThisToBeAFoo1 object){...}
private  foo2 makeFoo2(iNeedThisToBeAFoo2 object){...}
private  bar1 makeBar1(iNeedThisToBeABar1 object){...}
private  bar2 makeBar2 (iNeedThisToBeABar2 object){...}
private fooBarChimera makeChimera (){...}

}//buildPartFooBar 类结束

然后很容易包含一个方法 makeFooFromBar,您可以在其中返回 foo1 或 Foo2 或您喜欢的任何内容,您可能会通过 fooBarChimera 类中的静态方法来执行此操作

请记住,您将需要处理转换后的 bar 和 foo 类相互关联的情况(您可能需要实现某种形式的具有 bar 键和 foo 对象的集合,或者这应该在您的 fooBarChimera 中实现某处)。

您可能会决定 foo 和 bar 也需要类似的方法,例如,将这些方法作为静态比较包含在 fooBarChimera 中可能是明智的。这样,您只需要在父级中编写一次。

canThisFooBeBar

canThisBarBeFoo

这样在创建时您可以比较它们并决定它们是否应该自动链接,然后如果您的收藏中已经存在链接,则可以节省转换操作。

您还需要确定转换是否为 2 路,foo 可以是 bar,但 bar 可能与 2 foo 兼容。

在这种情况下,您可能决定转到可以处理此类事情的数据库并将您的 foo 和 bar 对象存储在其中,这也可能比自定义的集合类更容易,尤其是如果您为每个 foo 和 bar 赋予唯一性对象 ID(指导)。

它可能会变得更先进......这取决于你打算把它带到哪里,听起来像你自己设定的一个有趣的任务,我们可以问你为什么要这样做吗?

我可能只是为了好玩而做的事情......就像当我根据 java 集合对遗留数据库进行建模时,才意识到我是多么愚蠢,只是将其转换为更明智的数据库。

大卫

于 2013-06-14T10:27:07.323 回答