我有几个来自外部来源(不可修改)的不同类代表相同的概念。例如Address
。我有com.namespace1.Address
(包含字段houseNum
,street
,city
),com.namespace2.Address
(包含字段h
,s
,{ {1}}),c
(包含字段namespace3.com.CoolAddress
,house_num
,street
)。
问题是我使用的某些Web服务需要某些Address对象类型,所以我需要创建city
给定com.namespace1.Address
。这些字段很容易映射,但我正在寻找一个如何做的模式。
从我的角度来看,实例对象namespace3.com.CoolAddress
没有意义,因为没有状态(只有行为),当类只有行为时,它归结为实用程序类中的静态方法。从长远来看,无论何时我需要将新对象映射到另一个,我都有一个地方可以添加/修改/删除方法。如何完成它可能会改变,但我知道代码所在的位置(在一次位置)并且可以在需要时更改映射。
思想?
答案 0 :(得分:8)
我认为您正在寻找的是工厂类。当您需要能够实例化由工厂而不是开发人员确定的几个相关类中的一个时,将使用工厂模式。
请参阅http://en.wikipedia.org/wiki/Factory_method_pattern
你是正确的尝试将所有这些业务逻辑保存在一个地方,而不是做ClassOne.toClassTwo(),ClassOne.toClassThree(),...
我能想到的最灵活的方法是实现这个(但不是最简单的方法)是让工厂从一个简单的类开始,只包含基本的常用方法,并将处理程序添加到Hashtable或其他容器中。这样,您就不需要具体实现每种可能的功能组合。
当然,对每个可能的地址变量进行具体实现会更快,但是会有相当多的重复代码,并且添加新的地址类类型会有点困难。
答案 1 :(得分:1)
由于你不能自己修改类,我建议为每个方向实现Adapter模式。正如您所说,适配器方法本身可以是静态的,但您可以将单个类中的两个方向分组,以便逻辑在一个位置。
在一天结束时,无论你怎么称呼它,或者你把代码放在哪里,你都将执行相同的任务。我建议两个方向都存在于同一个文件中,因为当两个方向都发生变化时,它们通常都需要更新。
答案 2 :(得分:0)
如果你总是转换到同一个类,我会保持简单并将所有转换代码放在该类中,而不用担心工厂等,特别是如果你只处理几个不同的类。为什么这些东西总是需要复杂的模式?!
public class A {
...
public static A convertB(B b) {
...
}
}
答案 3 :(得分:0)
您需要输出的类final
吗?如果没有,您可以将它们子类化以创建正确的Adapters。否则,我会使用dj_segfault的工厂建议和一个处理程序表。
或者,等等 - 它只是一个您需要与之交谈的网络服务吗?如果是这样,那么你的数据类型的实现就不应该是包装输入数据类型的适配器,或者你自己的某个中间对象。