我有一个代表GUI控件的类层次结构。像这样:
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中正确执行此操作?
我考虑使用“访客”模式的原因是,某些算法将需要在实现类的项目中不可用的引用,并且存在许多不同的算法,因此我避免使用大型类。