GUIコントロールを表すクラスの階層があります。このようなもの:
Control->ContainerControl->Form
さまざまなことを行うオブジェクトで動作する一連のアルゴリズムを実装する必要があり、Visitorパターンが最もクリーンなソリューションになると考えています。たとえば、オブジェクトの階層の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でそれを適切に行う方法がわかりませんか?
訪問者パターンを検討している理由は、一部のアルゴリズムではクラスが実装されているプロジェクトでは利用できない参照が必要であり、多数の異なるアルゴリズムがあるため、大きなクラスを避けるためです。