【发布时间】:2012-05-12 12:34:59
【问题描述】:
我对访问者模式有点不友好,但我有一个任务需要访问者实现(如果我想避免“instanceof”检查)。
我有一个类是几个 gwt 元素的包装器:标签、面板、小部件(可以是复选框、列表框、文本框等)。我使用数组作为 UI 相似部分的集合。例如。标签+复选框,标签+文本框;标签+按钮等
某些元素以不同的方式构造(例如派生自 Panel 的另一个类的一部分)。因此,我有两个相同的构造函数,但在一个地方使用了重载方法。我可以合并这些构造函数并在提到的方法中使用“instanceof”检查元素。但我不喜欢这个解决方案,想用访客模式替换它。说实话,我不知道怎么做,希望对你有所帮助。
这是我所拥有的一个例子:
public class MyWidgets {
private String stringLabel;
private Widget widget;
private Panel panel;
public MyWidgets(String stringLabel, Widget widget) {
this.stringLabel = stringLabel;
this.widget = widget;
initPanel(stringLabel, widget);
}
public MyWidgets(ConstructedClass cs, Widget widget) {
this.widget = widget;
initPanel(cs, widget);
}
private initPanel(String label, Widget widget) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
private initPanel(ConstructedClass cs, Widget widget) {
panel = SomeStaticUtilityClass(cs, widget);
}
}
类似的东西(我尽量让它抽象,实际上它更难)。
所以我有一个使用“instanceof”的解决方案:
private initPanel(Object object, Widget widget) {
if(object instanceof String) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
if(object instanceof ConstructedClass) {
panel = SomeStaticUtilityClass.initPanelFromObject(cs, widget);
}
}
我想从“instanceof”中解救出来,只留下一个构造函数,甚至,如果可能的话,还有一个没有重载版本的 init 方法。 提前感谢您的建议,帮助。
P.S> 我再说一遍,上面的类是捏造的,看起来有些误解,尤其是这个字符串标签:)
【问题讨论】:
-
Hmm.. 以下行似乎有些奇怪:“panel = SomeStaticUtilityClass(cs, widget);”。 SomeStaticUtilityClass 是类还是方法? :)
标签: java gwt polymorphism instance