我对访问者模式有点不友好,但我有一个需要访问者实现的任务(如果我想避免“instanceof”检查)。如何使用访问者模式替换“instanceof”
我有一个类是几个GWT元素的包装:标签,面板,小工具(可以是复选框,列表框,文本框等)。我使用一个数组作为UI的相似部分的集合。例如。标签+复选框,标签+文本框;标签+按钮等。
某些元素以不同的方式构建(例如派生自另一个类的一部分,例如Panel)。因此,我有两个相同的构造函数,但是在一个地方使用了重载方法。我可以合并这些构造函数,并使用里面提到的方法中的“instanceof”来检查元素。但我不喜欢这个解决方案,并且想用Visitor模式替换它。说实话,我不知道该怎么做,希望对你有所帮助。
这里是什么,我有一个例子:
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>我再说一遍,上面的类制作,看起来像一些误解尤其是这个字符串标签:)
嗯..东西似乎是奇怪的以下行:“panel = SomeStaticUtilityClass(cs,widget);”。 SomeStaticUtilityClass是类还是方法? :) – Javaguru
我更正了示例 – Dragon