Предположим, что я моделирую коллекцию агентов. Этими агентами может управлять игрок или бот. Кроме того, у каждого агента есть роль - например, Explorer или Engineer. Все роли имеют одинаковые общие действия, но каждый из них может выполнять действия несколько иначе. В идеале вы сможете вызвать agentInstance.move(), и действие будет разыгрываться в зависимости от того, какую роль они имеют.Как подключить один из множества наборов реализаций к объекту?
Я боролся с тем, как смоделировать это какое-то время, и посмотрел на модели Strategy и Template, но я не уверен, что они то, что мне нужно.
Одна из идей заключается в создании подклассов игрока и бота абстрактного агента и создании подклассов Explorer и Engine абстрактной роли. Тогда у каждого Агента будет роль. Однако это, по-видимому, подразумевает, что мне придется передавать мои команды следующим образом: agentInstance.getRole().move()
или создавать вспомогательные функции, такие как agentInstance.move(){ this.role.move(); }
- что кажется немного неэлегантным.
Я также знаю, что мои конструкции могут быть битный интерфейс с дефицитом, поэтому я считал, моделированием ролей как интерфейсы и суб-интерфейсы с реализацией по умолчанию, которые затем унаследованный агент, но это чувствует как решение, ищущее проблему.
Итак - что лучше всего подходит для моделирования этого? Какие соображения имеют решающее значение для решения, особенно с использованием аналогичных интерфейсов Java 8 и абстрактных классов?
Это справедливо - каковы ваши мысли о необходимости "Туннель" команды через agent.role.move()? Разве это не так грязно, как мне кажется? –
Это приемлемо для меня, поскольку весь смысл заключается в использовании полиморфизма. Но лучше, если Player/Bot должен только вызвать agentInstance.move(). И затем вы делегируете поведение Move() на роль агента (вызывая функцию Role.Move() внутри Agent.Move()). Затем, в зависимости от роли, которую вы даете этому агенту, он будет двигаться по-другому. Но это в основном зависит от бизнеса, который вы моделируете. –