Ich schreibe einen Simulator, der mehrere Schnittstellen hat, die alle simulierten Objekte implementieren. Die Schnittstelle Entity
verfügt über Methoden, die alle Objekte haben müssen, z. B. das Abrufen von IDs und das Vorrücken des Zeitschritts für den Status des Objekts. Collidable
erweitert Entity
und stellt alles mit Volumen und Position dar, die berücksichtigt werden sollten, wenn Kollisionserkennungsalgorithmen ausgeführt werden. Field
erweitert Entity
und stellt alles dar, das einen Standort einem Wert zuordnet; Diese werden verwendet, um Dinge wie magnetische Felder zu modellieren, die die Welt durchdringen, aber kein Volumen oder physische Form haben. RigidBody
ist eine Klasse, die Collidable
implementiert und Starrkörperdynamikalgorithmen bereitstellt. Ich habe eine World
Klasse, die alle Entities
verwaltet und hat Methoden, um die Uhr des Simulators voranzutreiben und die Welt zu teilen, um Kollisionserkennung effizienter zu machen.Was ist ein gutes Muster zum Speichern von Implementierungen einer Schnittstelle und Abrufen bestimmter Implementierungen?
Mein Problem beinhaltet Entity
Subtypen von World
. Ursprünglich hatte World
gerade eine Karte von Entities
durch ID verschlüsselt, und eine Field
oder RigidBody
zurückzuholen gäbe es Methoden, die die Entity
aus der Karte herausholen und eine instanceof
Prüfung plus eine Besetzung zum gewünschten Subtype tun würden. Ich bin mir bewusst, dass instanceof
Nutzung ist jedoch verpönt, so dass ich einen anderen Ansatz versucht.
Derzeit habe ich separate Karten innerhalb World
für jede Schnittstelle. Zum Beispiel gibt es eine Karte für Collidables
sowie eine Karte für alle Entities
. Die Methode addCollidable()
fügt beiden Karten hinzu und getCollidable()
ruft nur die Karte Collidable
ab. Dies vermeidet instanceof
, aber es scheint mir immer noch schlechtes Design. Wenn ich mir eine andere Schnittstelle ausdenke, um Entity
zu erweitern, brauche ich eine andere Karte in World
und entsprechende Methoden.
Ich fühle mich wie dieses Problem ist nicht schrecklich obskur, was wird typischerweise in dieser Situation getan?
EDIT
Ich glaube nicht, das Besucher-Muster hier arbeiten, wie Besucher Sie auf den konkreten Typ versenden können, und einige meiner Abrufmethoden benötigen Interface-Typen abzurufen. Zum Beispiel würde Visitor funktionieren, wenn World
nur Methoden zum Abrufen von RigidBodies
und anderen solchen konkreten Klassen benötigt, aber ich kann keine Methode erstellen, die alle Collidables
mit Visitor abruft.
Sie können etwas haben wie ' T getEntityFromMap (Clase clazz)', diese Methode entfernt die Notwendigkeit von 'Collidables' map, und Sie fragen nur nach' getEntityFromMap (Entity.class) ', um ein zu bekommen Entität in ihrem allgemeinsten Fall und .... –