2010-12-10 6 views
0

Ich möchte das Composite-Entwurfsmuster in C++ verwenden, um Objektgruppen erstellen und bearbeiten zu können. Ein Problem, auf das ich gestoßen bin, ist, dass, da Blätter und Verbundwerkstoffe gleich behandelt werden und Verbundwerkstoffe aus Blättern und Verbundwerkstoffen bestehen, ein Objekt mehr als einmal bearbeitet werden kann, wenn ein Befehl an ein Verbundmaterial ausgegeben wird.Mit dem kombinierten Entwurfsmuster für Objekte unterschiedlichen Typs kann verhindert werden, dass ein Objekt mehr als einmal bearbeitet wird.

Zum Beispiel enthält eine zusammengesetzte Gruppe1 die Objekte A und B. Dann wird eine zusammengesetzte Gruppe2 erstellt, die die zusammengesetzte Gruppe1 und das Objekt A enthält. Wenn die zusammengesetzte Gruppe2 bearbeitet wird, wird Objekt A zweimal bearbeitet. Für einige Anwendungen denke ich, dass dies kein Problem ist, aber für meine Zwecke würde ich es mögen, wenn für jeden Befehl, der an einen Verbund ausgegeben wird, einzigartige Objekte nur einmal bearbeitet werden.

Gibt es einen idiomatischen Weg, um mit diesem Problem umzugehen, entweder wie man mehrere Aufrufe der Elementfunktion eines Objekts verhindert oder verhindert, dass ein Objekt mehr als einmal in einem Verbund enthalten ist?

-

Update: Mit "idiomatische" Ich meine "traditionelle" oder "akzeptiert" Art und Weise, diese Art von Problem der Handhabung. Ich vermute, ich nehme nur an/hoffe, dass dies ein häufiges Problem ist, das eine etablierte Lösung hat.

+0

Ihr Problem ist, dass Objekt A zwei "Eltern" hat, was versuchen Sie hier zu erreichen? Warum ist dieses Objekt in zwei Gruppen? Wenn es sein muss, dann wird die Standardidee, eine Operation anzuwenden, nicht so funktionieren, wie Sie es erwartet haben. Sie müssen irgendwie verfolgen, welche Objekte Sie 'diese' Operation ausgeführt haben und nur für ein Objekt ausführen, wenn Sie dies nicht tun. –

+0

Was ich versuche zu erreichen, ist die Flexibilität der Gruppen, die nicht nur aus einzelnen Objekten, sondern aus einer beliebigen Kombination von Objekten und bestehenden Gruppen erzeugt werden - im Grunde ist das Composite-Muster dafür geeignet, Blätter und Composites gleich behandeln zu können durch die Komponentenschnittstelle? – zebraman

Antwort

1

Ich weiß nicht, was Sie mit idiomatisch meinen, aber eine Lösung würde davon abhängen, wie Sie die Struktur von Verbundwerkstoffen durchqueren. Hier sind einige Möglichkeiten

  • , wenn Sie einen Besucher nutzen und erinnern sich an die bereits besuchten Komponenten, ignorieren Duplikate
  • eine Taktzählung verwenden und das Verbundelement aufeinanderfolgende Anrufe mit der gleichen Taktzählung
  • in einem zwei ignorieren Schritt Methode sammeln Sie alle zusammengesetzten Objekte, die in einem Satz bearbeitet werden müssen und führen Sie dann Ihre Operation
  • in einer zweistufigen Methode setzen Sie ein Flag in Ihre zusammengesetzten Objekte, die angibt, wenn sie in dieser Runde berührt wurden, löschen Sie die Flagge vor die nächste Runde
+0

Danke, ich denke, ich werde die Flag-Methode ausprobieren. Aber wundern Sie sich, ist diese Art von Problem (nicht mehrere Aufrufe von Elementfunktionen eines Objekts) nicht häufig mit dem Composite-Muster verbunden? Ich fühle wie es sein muss. Oder wird das Composite-Muster normalerweise für Anwendungen verwendet, bei denen dies keine Rolle spielt? Gibt es ein besseres Entwurfsmuster, das ich verwenden sollte, wenn ich nur einen Funktionsaufruf pro Objekt sicherstellen möchte? – zebraman

Verwandte Themen