Ho una gerarchia di classi che rappresenta i controlli della GUI. Qualcosa come questo:
Control->ContainerControl->Form
Devo implementare una serie di algoritmi che funzionano con oggetti che fanno varie cose e sto pensando che il modello Visitatore sarebbe la soluzione più pulita. Prendiamo ad esempio un algoritmo che crea una rappresentazione XML di una gerarchia di oggetti. Usando l'approccio 'classico' farei questo:
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;
}
}
Ma non sono sicuro di come farlo con il modello visitatore. Questa è l'implementazione di base:
public class ToXmlVisitor : IVisitor
{
public void Visit(Form form)
{
}
}
Dal momento che anche le classi astratte aiutano con l'implementazione non sono sicuro di come farlo correttamente in ToXmlVisitor?
La ragione per cui sto prendendo in considerazione il modello di Visitatore è che alcuni algoritmi avranno bisogno di riferimenti non disponibili nel progetto in cui sono implementate le classi e ci sono un certo numero di algoritmi diversi, quindi sto evitando classi di grandi dimensioni.