2009-08-06 38 views
15

我有幾個不同的類來自外部來源(不可修改),代表相同的概念。例如Address。我有com.namespace1.Address(與場houseNumstreetcity),com.namespace2.Address(與場hsc),namespace3.com.CoolAddress(與場house_numstreetcity)。對象轉換模式

問題是我使用的某些Web服務需要某些地址對象類型,所以我需要創建一個com.namespace1.Address給定namespace3.com.CoolAddress。這些字段很容易映射,但我正在尋找如何做到這一點的模式。

從我的角度來看,實例對象AddressConverter沒有意義,因爲沒有狀態(只有行爲),並且當類只有行爲時,它歸結爲實用程序類中的靜態方法。從長遠來看,無論何時我需要將新對象映射到另一個對象,我都有一個地方可以添加/修改/刪除方法。它的做法可能會改變,但我知道代碼的位置(在一次),並可以在需要時更改映射。

想法?

回答

8

我想你要找的是工廠類。工廠模式用於需要能夠實例化幾個相關類中的一個時,由工廠而不是開發人員確定。

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

你說得對,以儘量保持所有這些業務邏輯在一個地方而不是做ClassOne.toClassTwo(),ClassOne.toClassThree()的,...

最靈活我可以想到實現這一點(但不是最簡單的方法)的方式是讓工廠從一個簡單的類開始,只有基本的常用方法,並將處理程序添加到散列表或其他容器中。這樣你就不需要具體實現每個可能的功能組合。

當然,對於每個可能的地址類型,具體實現會更快,但是會有相當數量的重複代碼,並且添加新的地址類類型會有點困難。

+1

+1處理程序表建議 - 我使用該模式相當多。 但使用'Map'而不是'Hashtable'。 :) – 2009-08-06 07:48:22

+1

工廠是一個創建模式。問題在於管理現有對象而不是創建新對象。 – SomeWittyUsername 2012-10-25 14:17:35

+0

@icepack我認爲OP在將一個對象映射到另一個時想要創建新的實例。我認爲,用「來自外部來源(不可修改)的幾個不同對象」的句子來表示這些對象的類別是不可修改的。我將其基於以下句子:「我需要**創建** com.namespace1.Address給定namespace3.com.CoolAddress。」。我將編輯這個句子。 – 2012-10-27 21:37:54

1

由於您無法自行修改類,因此我建議您爲每個方向實施Adapter模式。正如你所說的,適配器方法本身可以是靜態的,但是你可以在一個類中對兩個方向進行分組,以便邏輯全部集中在一個地方。

在一天結束時,無論您怎樣稱呼它,或者在何處放置代碼,您都將執行相同的任務。我建議兩個方向都存在於同一個文件中,因爲當任一方向改變時,它們通常都需要更新。

0

如果你總是轉換到相同的類,我會保持簡單並將所有轉換代碼放在該類中,而不用擔心工廠等,尤其是如果你只處理幾個不同的類。爲什麼這些東西總是必須有複雜的模式?!

public class A { 

    ... 

    public static A convertB(B b) { 

    ... 

    } 
} 
+0

問題是原始對象是不可修改的。 – 2009-08-06 03:58:52

+0

@BrianYarger我認爲他的意思是類定義是可以修改的。我根據以下句子:「我需要**創建** com.namespace1.Address給定namespace3.com.CoolAddress」。 – 2012-10-27 21:42:51

+0

通過將轉換邏輯放在類中,代碼現在緊密耦合。設計模式的一點是避免可以彼此獨立存在的類的耦合。我建議不要在這個答案中給出建議。 – Chaos 2014-04-08 00:56:28

0

您需要輸出的類是final?如果不是,您可以將它們分類以創建適當的Adapters。否則,我會用dj_segfault的一個帶有一個處理程序表的Factory的建議。

或者,等一下 - 它只是一個您需要與之通話的Web服務?如果是這樣,那麼你的數據類型實現不應該是包裝輸入數據類型的適配器,或者你自己的一些中間對象。