Java 对象转换模式

Java 对象转换模式,java,object,dictionary,design-patterns,Java,Object,Dictionary,Design Patterns,我有几个来自外部来源的不同类(不可修改),它们代表相同的概念。例如地址。我有com.namespace1.Address(带字段houseNum,street,city),com.namespace2.Address(带字段h,s,namespace3.com.CoolAddress(带字段houseum,street,城市) 问题是,我使用的某些web服务需要特定的地址对象类型,因此我需要创建com.namespace1.Address给定namespace3.com.CoolAddress。

我有几个来自外部来源的不同类(不可修改),它们代表相同的概念。例如
地址
。我有
com.namespace1.Address
(带字段
houseNum
street
city
),
com.namespace2.Address
(带字段
h
s
namespace3.com.CoolAddress
(带字段
houseum
street
城市)

问题是,我使用的某些web服务需要特定的地址对象类型,因此我需要创建
com.namespace1.Address
给定
namespace3.com.CoolAddress
。这些字段很容易映射,但我正在寻找一个如何映射的模式

在我看来,实例对象
AddressConverter
没有意义,因为没有状态(只有行为),当类只有行为时,它归结为实用程序类中的静态方法。从长远来看,每当我需要将新对象映射到另一个对象时,我都有一个地方可以添加/修改/删除方法。它的实现方式可能会改变,但我知道代码的位置(在一个地方),并且可以在需要时更改映射


想法?

我想你要找的是工厂级的。当您需要能够实例化几个相关类中的一个时,将使用工厂模式,这些类由工厂而不是开发人员确定

您尝试将所有业务逻辑保持在一个位置,而不是执行ClassOne.toClassTwo()、ClassOne.toClassThree()、

我能想到的实现这一点的最灵活的方法(但不是目前为止最简单的方法)是让工厂从一个只包含基本公共方法的简单类开始,并将处理程序添加到哈希表或其他容器中。这样,您就不需要每种可能的功能组合的具体实现


当然,对每个可能的地址变量都有一个具体的实现会更快,但是会有相当数量的重复代码,而且添加新的地址类类型会有点困难。

因为您不能修改类本身,所以我建议为每个方向实现该模式。正如您所说,适配器方法本身可以是静态的,但是您可以在一个类中对两个方向进行分组,以便逻辑都在一个地方


在一天结束时,您将执行相同的任务,无论您如何称呼它,或将代码放在何处。我建议两个方向都在同一个文件中,因为当任何一个方向发生变化时,它们通常都需要更新。

如果您总是转换到同一个类,我会保持简单,将所有转换代码都放在该类中,而不必担心工厂之类的问题,特别是如果你只处理几个不同的类。为什么这些事情总是有一个复杂的模式

public class A {

    ...

    public static A convertB(B b) {

    ...

    }
}

您需要输出的类是否为最终类?如果没有,您可以对它们进行子类化,以创建适当的。否则,我会同意dj_segfault的建议,建立一个拥有一个处理人员表的工厂


或者,等等——这只是一个需要与之交谈的web服务吗?如果是这样,那么您的数据类型实现就没有理由不能是包装输入数据类型的适配器,或者您自己的中间对象。

问题是原始对象是不可修改的。@BrianYarger我想他的意思是类定义是UMNodeifiable的。我基于以下句子:“我需要创建一个给定namespace3.com.CoolAddress的com.namespace1.Address”。通过将转换逻辑放入类中,代码现在紧密耦合。设计模式的一个要点是避免可以独立存在的类之间的耦合。我建议不要使用这个答案中的建议。对于handler表建议+1——我经常使用这种模式。但是使用
Map
而不是
Hashtable
:)工厂是一种创造性的模式。问题是如何管理现有对象而不是创建新对象。@icepack我认为OP在将一个对象映射到另一个对象时确实希望创建新实例。我认为“几个不同的对象来自外部源(不可修改)”这句话的意思是对象的类是不可修改的。我是基于下面的一句话:“我被要求创建一个给定namespace3.com.CoolAddress的com.namespace1.Address。”。我将编辑这个句子。