GUI denetimlerini temsil eden bir sınıflar hiyerarşisi var. Bunun gibi bir şey:
Control->ContainerControl->Form
Çeşitli şeyler yapan nesnelerle çalışan bir dizi algoritma uygulamak zorundayım ve Ziyaretçi deseninin en temiz çözüm olacağını düşünüyorum. Örneğin, bir nesne hiyerarşisinin Xml temsilini oluşturan bir algoritmayı ele alalım. 'Klasik' yaklaşımını kullanarak şunu yaparım:
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;
}
}
Ancak bunu ziyaretçi kalıbıyla nasıl yapacağımdan emin değilim. Temel uygulama budur:
public class ToXmlVisitor : IVisitor
{
public void Visit(Form form)
{
}
}
Soyut sınıflar bile uygulamaya yardımcı olduğundan, ToXmlVisitor'da bunu nasıl doğru bir şekilde yapacağımdan emin değilim?
Ziyaretçi desen dikkate almamın nedeni, bazı algoritmaların sınıfların uygulandığı projede mevcut olmayan referanslara ihtiyaç duyması ve bu nedenle büyük sınıflardan kaçınmak için bir dizi farklı algoritma olmasıdır.