对象转换模式

2022-09-03 07:47:02

我有几个来自不同来源(不可修改)的类,它们代表相同的概念。例如。我有(带字段 , , ), (有字段 , , ), (有字段 , , )。Addresscom.namespace1.AddresshouseNumstreetcitycom.namespace2.Addresshscnamespace3.com.CoolAddresshouse_numstreetcity

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

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

思潮?


答案 1

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

查看 http://en.wikipedia.org/wiki/Factory_method_pattern

尝试将所有这些业务逻辑保存在一个地方是正确的,而不是执行ClassOne.toClassTwo(),ClassOne.toClassThree(),...

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

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


答案 2

由于您无法修改类本身,因此我建议为每个方向实现适配器模式。如前所述,适配器方法本身可以是静态的,但您可以将两个方向分组到单个类中,以便逻辑全部位于一个位置。

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