У мене є ієрархія класів, яка представляє елементи управління графічним інтерфейсом. Щось на зразок цього:
Control->ContainerControl->Form
Мені доводиться реалізовувати низку алгоритмів, які працюють з об'єктами, які роблять різні речі, і я думаю, що шаблон відвідувачів був би найчистішим рішенням. Візьмемо для прикладу алгоритм, який створює представлення Xml ієрархії об'єктів. Використовуючи «класичний» підхід, я зробив би це:
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;
}
}
Але я не впевнений, як це зробити з малюнком відвідувачів. Це основна реалізація:
public class ToXmlVisitor : IVisitor
{
public void Visit(Form form)
{
}
}
Оскільки навіть абстрактні класи допомагають у впровадженні, я не впевнений, як правильно це зробити в ToXmlVisitor?
Причина, по якій я розглядаю шаблон відвідувачів, полягає в тому, що для деяких алгоритмів потрібні посилання, недоступні в проекті, де реалізовані класи, і існує ряд різних алгоритмів, тому я уникаю великих класів.