2014-04-17 66 views
-1

我有一個要生成的報表,直到現在報表基於兩個選項,用戶可以從列表框中選擇一個選項。現在我需要提供第三個選項,選擇那個用戶應該得到這兩個選項的聯盟。可枚舉裝飾圖案

在Java中列表框元素是eNum,現在理論上我不能將第三個選項添加到枚舉中,因爲它們代表系統中的某些功能,而我的第三個選項實際上是兩者的聯合。

因此計劃創建另一個UI枚舉,該枚舉裝飾現有的枚舉。任何人都可以就此提出建議。

+0

請添加你如何真正解決你的兩個選項報告的一些基本示例代碼。 – vz0

+1

@ vz0,事情很簡單,用兩個枚舉鍵得到一個簡單的枚舉類,需要創建另一個裝飾的枚舉類。你真的在這裏需要示例代碼嗎? – Kumar

回答

2

不,你不能這樣做。裝飾器模式爲退出的對象添加了一些功能。在枚舉的情況下,這個概念不能應用。由於裝飾器,裝飾對象不是類。

你可以做的是創建一個類似於UserInterfaceOption的接口,然後通過枚舉聲明來實現它。如果你不改變現有枚舉的代碼,你可以爲它編寫一個裝飾器,並將結果放置到Collection中,稍後你將可以用作ListBox的輸入。

您無法更改的遺留代碼示例。

private enum LegacyEnum { 
    OPTION1, 
    OPTION2; 
} 


interface UserInterfaceOption { 

    public String getName(); 

} 

public enum MyEnum implements UserInterfaceOption { 
    OPTION3; 

    @Override 
    public String getName() { 
    return name(); 
    } 

} 

//This is a decorator/wrapper that allow to use options from legacy code 

public UserIntrfaceOptionForLegacy implements UserInterfaceOption { 

private final LegacyEnum legacy; 

UserIntrfaceOptionForLegacy(LegacyEnum legacy) { 
    this.legacy = legacy; 
} 

@Override 
public String getName() { 
    this.legacy.name(); 
} 

} 

的使用

public void Collection<UserInterfaceOption> getOptions() { 

    Collection<UserInterfaceOption> options = new ArrayList<>(); 

    for(LegacyEnum legacy : LegacyEnum.values()) { 
     options.add(new UserIntrfaceOptionForLegacy(legacy)); 
    } 

    for(UserInterfaceOption option: MyEnum.values()) { 
     options.add(option); 
    } 

    return options; 
    } 
+0

完美的想法和裝飾者模式的關鍵點。偉大的想法,非常簡單和清潔的解決方案....非常感謝你 – Kumar

+0

您的歡迎;-)。 –