我对访问者模式不是很熟悉,但是有一个任务需要使用访问者模式(如果我想避免“instanceof”检查)。
我有一个类,它是几个gwt元素的包装器:Label、Panel、Widget(可以是复选框、下拉列表框、文本框等)。我使用数组作为类似 UI 部件的集合。例如:Label + 复选框,Label + 文本框;Label + 按钮等。
一些元素以不同的方式构造(从另一个派生的类的一部分)。因此,我有两个相同的构造函数,在一个地方使用了重载方法。我可以在上述方法中合并这些构造函数并使用“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> 我再次重申,上面的类是虚构的,看起来有点混乱,特别是这个String label :)