Tengo una jerarquía de clases que representa los controles de la GUI. Algo como esto:
Control->ContainerControl->Form
Tengo que implementar una serie de algoritmos que funcionan con objetos que hacen varias cosas y estoy pensando que el patrón de visitante sería la solución más limpia. Tomemos, por ejemplo, un algoritmo que crea una representación Xml de una jerarquía de objetos. Usando el enfoque 'clásico', haría esto:
public abstract class Control
{
public virtual XmlElement ToXML(XmlDocument document)
{
XmlElement xml = document.CreateElement(this.GetType().Name);
// Create element, fill it with attributes declared with control
return xml;
}
}
public abstract class ContainerControl : Control
{
public override XmlElement ToXML(XmlDocument document)
{
XmlElement xml = base.ToXML(document);
// Use forech to fill XmlElement with child XmlElements
return xml;
}
}
public class Form : ContainerControl
{
public override XmlElement ToXML(XmlDocument document)
{
XmlElement xml = base.ToXML(document);
// Fill remaining elements declared in Form class
return xml;
}
}
Pero no estoy seguro de cómo hacer esto con el patrón de visitante. Esta es la implementación básica:
public class ToXmlVisitor : IVisitor
{
public void Visit(Form form)
{
}
}
Dado que incluso las clases abstractas ayudan con la implementación, no estoy seguro de cómo hacerlo correctamente en ToXmlVisitor.
La razón por la que estoy considerando el patrón de visitante es que algunos algoritmos necesitarán referencias no disponibles en el proyecto donde se implementan las clases y hay una serie de algoritmos diferentes, por lo que estoy evitando clases grandes.