Каков хороший шаблон для хранения реализаций интерфейса и извлечения конкретных реализаций?

Я пишу симулятор, который имеет несколько интерфейсов, которые реализуют все моделируемые объекты. Интерфейс Entityсодержит методы, которые должны быть у всех объектов, такие как извлечение идентификатора и увеличение временного шага для состояния объекта. Collidableрасширяет Entityи представляет что-либо с объемом и положением, которые следует учитывать при выполнении алгоритмов обнаружения столкновений. Полерасширяет Entityи представляет все, что сопоставляет местоположение со значением; они используются для моделирования таких вещей, как магнитные поля, которые пронизывают мир, но не имеют объема или физической формы. RigidBody— это класс, который реализует Collidableи предоставляет алгоритмы динамики твердого тела.У меня есть класс World, который управляет всеми Entitiesи имеет методы для опережения часов симулятора и разделения мира, чтобы сделать обнаружение столкновений более эффективным.

Моя проблема связана с получением подтипов Entityиз World. Первоначально в Worldбыла только карта Entitiesс ключом ID, и для получения Fieldили RigidBodyсуществовали методы, возьмите Entityс карты и выполните проверку instanceofплюс приведение к нужному подтипу. Однако я прекрасно понимаю, что использование instanceofосуждается, поэтому я попробовал другой подход.

В настоящее время у меня есть отдельные карты в Worldдля каждого интерфейса. Например, есть карта для Collidables, а также карта для всех Entities. Метод addCollidable()будет добавлять данные к обеим картам, а getCollidable()будет извлекать данные только из карты Collidable. Это позволяет избежать instanceof, но мне все равно кажется плохим дизайном. Если я придумаю другой интерфейс для расширения Entity, мне понадобится другая карта в Worldи соответствующие методы.

Мне кажется, что эта проблема не так уж неясна, так что же обычно делают в такой ситуации?

РЕДАКТИРОВАТЬ

Я не думаю, что здесь будет работать шаблон Visitor, так как Visitor позволяет выполнять диспетчеризацию для конкретного типа, а некоторые из моих методов поиска требуют получения типов интерфейса.Например, Visitor будет работать, если Worldнужны только методы для получения RigidBodiesи других подобных конкретных классов, но я не могу создать метод, который извлекает все Collidablesс помощью Visitor. .

9
задан derefed 9 April 2012 в 14:04
поделиться