Как использовать шаблон Visitor для замены «instanceof»

Я немного не дружу с шаблоном Visitor, но у меня есть задача, которая должна иметь реализацию Visitor (если я хочу избежать проверок "instanceof").

У меня есть класс, являющийся оболочкой для нескольких элементов gwt: Label, Panel, Widget (может быть флажок, список, текстовое поле и т. д.). Я использую массив как набор одинаковых частей пользовательского интерфейса. Например. Метка + флажок, Метка + текстовое поле; Ярлык + кнопка и т.д.

Некоторые элементы построены по-другому (часть другого класса, производного, например, от 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" и оставить только один конструктор и даже, если возможно, один метод инициализации без его перегруженной версии. Заранее спасибо за ваши предложения, помогите.

С.S> Повторяю, класс выше сфабрикован и выглядит как какое-то недоразумение, особенно с этой меткой String :)

5
задан Bhavik Ambani 12 May 2012 в 12:56
поделиться