Здравствуйте, Burlaka, Вы писали:
B>Делаю небольшую real time strategy game в образовательных целях на java.
B>Есть класс Unit (общий interface для всех юнитов) — юниты. Они могут быть Movable (interface) — двигующиеся и Attackable (interface) — атакующие, комбинировать эти свойства или не обладать ими вообще. Movable юниты должны поддерживать 2 состояния — Moving и Stop. Для реализации состояния Moving могут использоваться разные стратегии движения. Attackable также должен поддерживать 2 состояния — Attack и Guard в каждом из них должна быть реализована своя стратегия поведения.
B>Как лучше организовать иерархию классов?
Советую рассмотреть такой подход: не представлять каждый тип поведения интерфейсом и не комбинировать, ибо это сильно запутает архитектуру, а представить каждый тип юнита (с различным поведением) как отдельный класс. Типу юнита будет соответствовать машина состояний (нарисованные на бумажке состояния и переходы между ними, например состояния "идет", "поворачивается", "падает", "озирается" и т.д., переходы между состояниями иницируются вызовами методов интерфейса данного типа юнита, только посредством этих методов можно влиять на состояние юнита, например turn, walk, kill...). Машина состояний будет реализована через паттерн State, у например у класса WarriorUnit будет private поле WarriorUnitState (абстрактный класс), в каждый конкретный момент времени это поле будет хранить ссылку на конкретное состояние, например WalkingState или DyingState, DiedState. Такой подход удобен тем, что можно с легкостью расширять машину состояний, а расширять её придется неизбежно непредусмотренными заранее состояниями, или чтобы ввести плавность переходов между ними, придется вводить промежуточные состояния типа "доставать оружие", "убирать оружие", "радоваться победе" и много-много других. "Комбинированный" же подход, мне кажется, в этом случае может запутать сложностью.
Также заранее нужно подумать о одно- или много-поточности, о типе ИИ (глобальный (классический, когда персонаж имеет доступ ко всем данным игрового мира) или перцептуальный (воплощенный, когда персонаж воспринимает мир только с помощью ограниченного набора методов)), дискретной или непрерывной модели, типе взаимодействия (event-driven или нет), будет ли разделение на вид-модель.