不同Java类型之间的转换器

时间:2013-06-14 09:58:46

标签: java oop design-patterns generics interface

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

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

2 个答案:

答案 0 :(得分:1)

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

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

或者只是创建新实例使用“工厂”或“构建器”。

答案 1 :(得分:1)

我会选择一个公共接口和一个公共父类,也可能使用构建器模式..;

a common partialFooBar interface
a common fooBarChimera parent class

然后,您可以将您的转换器放入fooBarChimera父级(并强制执行所需的额外详细信息,以便最终确定您想要的任何内容。

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

将它充实......

即第一堂课

partialFooBarBuilder

有一个简单的默认constrcutor和setter方法。

最终方法将把这个类'转换'为'full blown'版本,或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 clases彼此相关的情况(您可能需要实现某种形式的具有条形键和foo对象的集合,或者这可能应该实现在你的fooBarChimera某处。)

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

couldThisFooBeBar

couldThisBarBeFoo

因此,在创建时,您可以比较它们并确定它们是否应自动链接,然后如果链接已存在于您的集合中,则保存转换操作。

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

在这种情况下,您可能决定转向可以处理此类事物的数据库并将foo和bar对象存储在其中,它也可能比定制的集合类更容易,特别是如果您给每个foo和bar a uniquie objectID(guid)。

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

我可能只是为了好玩而做的事情....就像我在java集合中建模遗留数据库一样,只是为了实现我是多么愚蠢,而只是将它转换为更合理的数据库。

大卫