2013-08-21 1 views
2

В принципе, все классы производятся от базового класса Element, однако в любой данный момент структура может содержать любой производный элемент.Внедрить шаблон посетителя без указания всех производных типов в интерфейсе посетителя?

Посетитель должен напечатать элемент в нескольких разных стилях и реализовать интерфейс ElementVisitor.

Возможно ли реализовать шаблон посетителя без указания всех производных типов в интерфейсе посетителя?

Если нет, то было бы альтернативы, учитывая, что Element и ElementVisitor являются компонентами уровня рамки, что мы должны быть в состоянии продлить в любое время но не редактировать в любое время.

Element может в любое время acceptList<ElementVisitor> так:

class Element 
{ 
    public void accept(List<ElementVisitor> actions) { 
     foreach(ElementVisitor action : actions) 
     { 
      action.visit(this); 
     } 
    } 
} 

Примечание: каркас еще в своей производственной фазе, поэтому дизайн может все еще быть изменен, если шаблон посетитель не допустит этого.

Есть instanceof единственный способ обойти это? Каковы другие альтернативы, на которые я могу смотреть?

+0

Что вы имеете в виду «напечатать элемент в нескольких разных стилях»? – stan0

+0

В принципе, элементы имеют в нем данные, и каждый посетитель будет печатать только данные, относящиеся к нему. – Chad

ответ

1

Шаблон посетителя является хорошим выбором, если операции будут часто распространяться. Однако не оптимально, если элементы будут часто распространяться. По крайней мере, пока посетитель нуждается в функциональности конкретных элементов, которые не содержатся в общем предке элементов.

В случае, если операции, реализованные через посетителя, имеют тенденцию быть более стабильными, чем классы элементов, было бы лучше определить операции как абстрактные методы в предке или интерфейсе, реализованные всеми конкретными элементами, чем с использованием шаблона посетителя.