2016-11-14 70 views
0

刪除重複的代碼,最有效的方法我們有3種在我們的項目屬性:的CategoryAttributeProductAttributeProductTypeAttribute。這些不在我們的控制範圍之內,因爲它們來自自動生成的類,並且可能包含不同類型的屬性值,例如textnumber or image。現在,每個屬性都有自己的策略來檢索attributeValue。爲簡單起見,我們假設他們全部3個都有TextStrategy,NumberStrategyImageStrategy從多種策略

實施例的策略:

@Component 
public class CategoryImageAttributeStrategy implements CategoryAttributeStrategy { 

    @Override 
    public boolean isApplicable(CategoryAttribute attribute) { 
     return attribute.getImage() != null; 
    } 

    @Override 
    public Object getAttributeValue(CategoryAttribute attribute) { 
     //return attribute value here 
     //may be different or may be the same 
     //for ProductImageAttributeStrategy and ProductTypeImageAttributeStrategy 
    } 

}

儘管取得圖像值可以是用於所有這些不同的,獲取文本值是相同的,我們最終3類的幾乎相同的代碼和我真的真的不喜歡複製代碼。

我想過爲每個策略類型創建一個抽象類/默認界面,例如DefaultTextStrategy所有3種文本策略都會繼承,並使用提供的默認代碼或使用自己的實現覆蓋它,但是我對此方法並不滿意,因爲它需要爲如此簡單的任務創建更多的類。

也許是有可能將相同類型的策略(如圖像)合併爲一個?

我真的很想聽聽更多有經驗的人在這個問題上有什麼要說的,因爲我想學習和改進。

提前感謝您的時間。

回答

0

這裏就是我所做的:

首先,我創建了一個接口名爲「AttributeValueStrategy」所有類型的策略。然後添加3個回調(類型特定,例如NumberValueCallback等)。現在,每個策略都實現了其類型的回調接口和AttributeValueStrategy接口。然後有DefaultStrategyMethods類包含每個類型的默認「getAtrribute」,實際的策略調用defaultStrategyMethods(如下所示)或只是實現自己的代碼。

@Override 
public Object getAttributeValue(Object attribute) { 
    return defaultStrategyMethods.getNumberValue(attribute, this); 
} 

回調創建,因爲只有實際的戰略,知道應該將它轉換爲哪一類(並有這樣做的方法),並DefaultStrategyMethods需要所以這就是爲什麼我傳遞「這個」作爲第二個參數(使用它這是回調本身)。

沒有更多的重複,一切都清晰乾淨。

0

應該只有3個策略。 TextStrategy,NumberStrategy和ImageStrategy,它們擴展了基本策略。將屬性和策略混合在一起會讓人感到困惑,因爲兩者實際上都是獨立的,並且彼此之間有很多關係。

讓3個屬性擴展一個Attribute類:CategoryAttribute,ProductAttribute和ProductTypeAttribute。

讓策略根據傳遞給它的Attribute類對象決定需要做什麼。對於文本策略,將會有單個實現。對於Image策略,您可能需要針對一個課程進行特殊處理。

+0

問題是(正如我在原始文章中提到的那樣),CategoryAttribute,ProductAttribute等是基於xsd模式的自動生成類,我無法控制它們,所以我不能讓它們擴展別的東西。我只喜歡3種策略,但是在策略類中,我必須採用Object參數並檢查它的instanceof(找出它的屬性類型),看起來有點髒。至少我認爲這是3個instanceof的適用方法是有點兒。 – Sikor