Stellen wir uns vor, ich hätte eine Sammlung von Knoten, die ich später für meine Renderer-Klasse verwende. Dann habe ich eine Besucherklasse, die den Knoten oder die gesamte Sammlung besuchen kann. Es ist einfach, weil meine Sammlung von Knoten es ist ein Wrapper für die std :: list mit einigen zusätzlichen Methoden.
Das Problem ist, dass ich eine baumähnliche Struktur für Knoten haben möchte (statt einer einfachen Liste), so dass ein Knoten ein Elternteil und n Kinder haben kann. Das wäre praktisch, da ich gerne einen Knoten an meinen Renderer übergeben und alles "unter" diesem Knoten rendern würde. Die Antwort ist wahrscheinlich Composite.
Wie kann ich Visitor und Composite zusammen verwenden? Ich habe gelesen, dass es oft eine gute Kombination ist, aber meine Implementierungen sehen ziemlich schlecht aus ... Ich vermisse etwas.
Ich habe etwas sehr ähnliches für unser System implementiert. Ich wollte eine Möglichkeit, die Hierarchie geometrischer Objekte zu erstellen und sie in das Volumen zu rendern. Ich habe ein zusammengesetztes Muster verwendet, um meine Beschreibung zu verfassen (root war Node und dann abgeleitetes Kind war compositeNode (Liste der Knoten).)
CompositeNode hat die Methode accept (), die einen Besucher (Visitor) akzeptiert, und dann innerhalb des accept (), den Sie visit- & gt; besuchen (this).
Ihre Besucherhierarchie hat also eine Basisklasse als NodeVisitor und abgeleitete Besucher wie RenderVisitor (Objekte rendern), ReportVisitor (gelöschte Knoteninformationen in Text). Ihre Basisklasse muss sowohl Basis- als auch spezialisierte Knotentypen akzeptieren.
Also, Combo funktioniert und ich habe funktionierenden Code, aber ich stimme zu, dass Design mehr Aufwand erfordert als das, was Sie online lesen würden (Wiki oder Spielzeug).
Hoffe, das hilft
Wenn Sie möchten, dass Ihr Besucher auch die Struktur des Baums kennt (z. B. die Tiefe, die er besucht, oder den Pfad von der Baumwurzel), können Sie das hierarchische Besuchermuster verwenden. Dies wird im c2.com-Wiki
etwas ausführlich beschriebenEs zeigt auch, wie man einen 'uninteressanten' Zweig überspringt.
Tags und Links c++ design-patterns oop composite visitor