我有一个要生成的报表,直到现在报表基于两个选项,用户可以从列表框中选择一个选项。现在我需要提供第三个选项,选择那个用户应该得到这两个选项的联盟。可枚举装饰图案
在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