我有一個要生成的報表,直到現在報表基於兩個選項,用戶可以從列表框中選擇一個選項。現在我需要提供第三個選項,選擇那個用戶應該得到這兩個選項的聯盟。可枚舉裝飾圖案
在Java中列表框元素是eNum,現在理論上我不能將第三個選項添加到枚舉中,因爲它們代表系統中的某些功能,而我的第三個選項實際上是兩者的聯合。
因此計劃創建另一個UI枚舉,該枚舉裝飾現有的枚舉。任何人都可以就此提出建議。
我有一個要生成的報表,直到現在報表基於兩個選項,用戶可以從列表框中選擇一個選項。現在我需要提供第三個選項,選擇那個用戶應該得到這兩個選項的聯盟。可枚舉裝飾圖案
在Java中列表框元素是eNum,現在理論上我不能將第三個選項添加到枚舉中,因爲它們代表系統中的某些功能,而我的第三個選項實際上是兩者的聯合。
因此計劃創建另一個UI枚舉,該枚舉裝飾現有的枚舉。任何人都可以就此提出建議。
不,你不能這樣做。裝飾器模式爲退出的對象添加了一些功能。在枚舉的情況下,這個概念不能應用。由於裝飾器,裝飾對象不是類。
你可以做的是創建一個類似於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;
}
完美的想法和裝飾者模式的關鍵點。偉大的想法,非常簡單和清潔的解決方案....非常感謝你 – Kumar
您的歡迎;-)。 –
請添加你如何真正解決你的兩個選項報告的一些基本示例代碼。 – vz0
@ vz0,事情很簡單,用兩個枚舉鍵得到一個簡單的枚舉類,需要創建另一個裝飾的枚舉類。你真的在這裏需要示例代碼嗎? – Kumar