簡體   English   中英

轉換對象的設計

[英]Design for converting objects

我正在嘗試提出一個很好的設計,將一組不同的對象轉換為一個公共對象。 基本上,我從系統A接收了一個(許多略有不同)復雜對象,並且必須將其轉換為系統B的簡單對象。

我要轉換的所有對象都繼承自同一基類,因此轉換的一部分始終是相同的。 但是在每種情況下,轉換都確實涉及我要轉換的對象類型非常特定的內容。 它可以是RPC,HTTP提取,數據庫查找或完全不同的東西。

我正在查看“ 模板”方法和“ 策略”模式。 但是,兩者似乎都不是完美的選擇。 問題在於要使用的方法/策略與要轉換的對象的類型有關,因此不能互換。

這是我正在考慮做的草圖:

class FooConverter {
    Map<String, FooConverter> converters;
    Foo convert(Bar bar) {
        Foo foo = ...;  // Common part of the conversion.
        FooConverter c = converters.get(bar.getType(), foo);
        c.finishConversion(bar, foo);
        return foo;
    }
}

令我煩惱的是FooConverter必須定義一個附加的轉換方法,該方法將部分轉換的對象作為參數。 因此,我最終將策略(由於所有轉換器實現相同的接口)和模板方法(由於轉換的公共部分由所有轉換器共享)混合使用。 有沒有更好的辦法?

您正在使用一堆“可轉換”對象,也許可以使“ Foo”為每種“可轉換”基本類型都具有裝飾器,當您檢測到“可轉換”類型時,可以將適當的裝飾器添加到“ Foo”中嗎?

聽起來您需要遍歷結構並能夠對結構中的每個元素執行某些操作。 這“東西”由元素的類型不同,你也希望能夠改變怎么說“東西”來實現。

如果真是這樣,這聽起來像很適合“ 訪客”模式。 我剛剛在一個像您一樣的場景中親自使用了它,我需要靈活地將一個結構轉換為另一個結構。

至少有兩種方法可以做到這一點:

  1. 使用模板方法。 那是在超類(Bar)中有一個轉換方法,並在子類(例如MyBar,HttpBar等)中實現它。 只要該類知道如何進行轉換,就可以了。 您可以在Bar中使用toFoo()方法。 子類將調用super.toFoo()並另外執行所需的操作。
  2. 由於概念上的轉換不是Bar的工作,所以上述方法可能並不總是理想的。 在這種情況下,您可以使用Visitor模式。 您可以具有轉換類的並行層次結構。 每個類都可以接受某種特定類型的Bar並進行轉換。

您可以為要從其轉換的每個給定類型的構造函數實現目標類型的子類。 從構造函數中調用其父類型的重載構造函數。

就像是:

public class ConvertedFoo extends Foo
{
    public ConvertedFoo(SuperTypeA a) {
        // Do some common stuff here.
    }

    public ConvertedFoo(SubtypeOfSuperTypeA a) {
        ConvertedFoo((SuperTypeA)a);
        // Do more specific stuff here.
    }
}

如果ConvertedFoo類太大,則可以很容易地將其拆分為子類型。

這樣可以最大程度地重復使用代碼,並且可以在不使用動態類型檢查的情況下集中所有轉換代碼。

我認為這不是命名模式。 如果有人知道,我想知道它的名字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM