Estoy escribiendo un simulador que tiene varias interfaces que implementan todos los objetos simulados. La interfaz Entity
tiene métodos que todos los objetos deben tener, como la recuperación de ID y avanzar el paso de tiempo para el estado del objeto. Collidable
se extiende a Entity
, y representa cualquier cosa con volumen y posición que deba considerarse cuando se ejecutan los algoritmos de detección de colisión. Field
se extiende Entity
, y representa cualquier cosa que mapea una ubicación a un valor; estos se usan para modelar cosas como campos magnéticos que impregnan el mundo pero no tienen volumen ni forma física. RigidBody
es una clase que implementa Collidable
y proporciona algoritmos de dinámica de cuerpo rígido. Tengo una clase World
que gestiona todos los Entities
y tiene métodos para avanzar el reloj del simulador y dividir el mundo para hacer que la detección de colisiones sea más eficiente.¿Cuál es un buen patrón para almacenar implementaciones de una interfaz y recuperar implementaciones específicas?
Mi problema consiste en recuperar Entity
subtipos desde World
. Originalmente, World
tenía un mapa de Entities
tecleado por ID, y para recuperar Field
o RigidBody
, habría métodos que tomarían el Entity
fuera del mapa y harían una verificación instanceof
más un molde para el subtipo deseado. Soy consciente de que el uso de instanceof
está mal visto, sin embargo, así que probé con otro enfoque.
Actualmente, tengo mapas separados dentro de World
para cada interfaz. Por ejemplo, hay un mapa para Collidables
, así como un mapa para todos Entities
. El método addCollidable()
se agregará a ambos mapas y getCollidable()
solo se recuperará del mapa Collidable
. Esto evita instanceof
, pero todavía me parece un diseño pobre. Si imagino otra interfaz para ampliar Entity
, necesitaré otro mapa en World
y los métodos correspondientes.
Siento que este problema no es terriblemente oscuro, entonces ¿qué se suele hacer en esta situación?
EDITAR
No creo que el patrón de Visitantes trabajará aquí, como Visitador le permite despachar el tipo de hormigón, y algunos de mis métodos de recuperación necesario para recuperar los tipos de interfaz. Por ejemplo, Visitor funcionaría si World
solo necesitara métodos para recuperar RigidBodies
y otras clases de concreto, pero no puedo hacer un método que recupere todo Collidables
con Visitor.
Puede tener algo como ' T getEntityFromMap (Clase clazz)', este método elimina la necesidad del mapa 'Collidables', y solo pide' getEntityFromMap (Entity.class) 'para obtener un Entidad en su caso más general, y .... –