2014-02-05 26 views
0

我正在實現一個可以相互轉換的類似數據對象的庫。爲了使其更具說明性,我將在下面假設數據對象是不同的圖像類型。說,我有以下類別Python中的數據對象之間的轉換器設計

class PixelImage(object): 
    pass 

class VectorImage(object): 
    pass 

class FourierImage(object): 
    pass 

什麼是設置之間的轉換器功能的好方法?這種情況下有沒有設計模式?問題是轉換器在源類和目標類上都需要一定的知識,但是我想避免這些類之間的強烈依賴關係。此外,如果設計開放以便稍後添加派生類(例如class CompressedPixelImage(PixelImage)),那就太好了。

下面我會討論我提出的兩種解決方案。備選方法和意見非常受歡迎。謝謝!

+0

爲什麼不使用工廠? – 2rs2ts

回答

0

解決方案1 ​​:使用成員函數to_TargetFormat(),例如,

pixel_image = PixelImage() 
vector_image = pixel_image.to_vector() 

優勢:它是短且用戶可以直接在API看到的對象的可能的轉換(例如,在交互式IPython的殼)。

缺點:我們緊密耦合。 PixelImage必須知道VectorImage類,特別是它的構造函數,因爲它必須創建VectorImage對象。如果我有很多課程,每個帽子都可以導入所有其他課程。

解決方案2:使用類別方法from_SourceFormat(),例如,

pixel_image = PixelImage() 
vector_image = VectorImage.from_pixel(pixel_image) 

優點:沒有明確的耦合。我們可以提供任何pixel_image類對象並從鴨子輸入中受益。 缺點:類方法調用看起來不夠優雅,可能對用戶來說不那麼直觀。

+0

解決方案3:使用包含轉換邏輯的第3個通用'Image'對象。這也有效地防止了耦合,因爲除了通用類別之外,其他類型的知識都不需要其他格式的知識。 –

+0

那麼您將如何定義API? –

相關問題