Mam hierarchię klas reprezentujących kontrolki GUI. Coś takiego:
Control->ContainerControl->Form
Muszę zaimplementować serię algorytmów, które działają z obiektami wykonującymi różne czynności i myślę, że wzorzec dla gości byłby najczystszym rozwiązaniem. Weźmy na przykład algorytm, który tworzy reprezentację Xml hierarchii obiektów. Stosując podejście „klasyczne” zrobiłbym to:
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;
}
}
Ale nie jestem pewien, jak to zrobić ze wzorcem odwiedzin. To jest podstawowa implementacja:
public class ToXmlVisitor : IVisitor
{
public void Visit(Form form)
{
}
}
Ponieważ nawet klasy abstrakcyjne pomagają w implementacji, nie jestem pewien, jak zrobić to poprawnie w ToXmlVisitor?
Powodem, dla którego rozważam wzorzec użytkownika, jest to, że niektóre algorytmy będą wymagały odwołań niedostępnych w projekcie, w którym zaimplementowane są klasy, i istnieje wiele różnych algorytmów, więc unikam dużych klas.