2014-04-17 67 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

您的欢迎;-)。 –