Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
PerfectJPattern's componentized version of the Visitor Pattern differs from the original GoF version in that:
IVisitor<E> type
for each new Concrete Element type. The AbstractVisitor<E>.visit(<E>) method or its
static variation reusableVisit handle all Element subtypes via double-dispatch.
accept(...) method.
AbstractVisitor<E> implementation that provides the
double-dispatch mechanism implemented on top of PerfectJPattern's Delegates. Adding new Concrete Visitor
is as simple as extending AbstractVisitor<E> (or otherwise reusing the static
reusableVisit implementation) and implementing the relevant visitXXX(...) methods
for each Element subtype of interest. Concrete Visitors' visit method names may be chosen freely, though a
good convention would be to use visitXXX(...) but it is not compulsory.