2016-08-12 6 views
0

Предположим, что я моделирую коллекцию агентов. Этими агентами может управлять игрок или бот. Кроме того, у каждого агента есть роль - например, Explorer или Engineer. Все роли имеют одинаковые общие действия, но каждый из них может выполнять действия несколько иначе. В идеале вы сможете вызвать agentInstance.move(), и действие будет разыгрываться в зависимости от того, какую роль они имеют.Как подключить один из множества наборов реализаций к объекту?

Я боролся с тем, как смоделировать это какое-то время, и посмотрел на модели Strategy и Template, но я не уверен, что они то, что мне нужно.

Одна из идей заключается в создании подклассов игрока и бота абстрактного агента и создании подклассов Explorer и Engine абстрактной роли. Тогда у каждого Агента будет роль. Однако это, по-видимому, подразумевает, что мне придется передавать мои команды следующим образом: agentInstance.getRole().move() или создавать вспомогательные функции, такие как agentInstance.move(){ this.role.move(); } - что кажется немного неэлегантным.

Example Model - Note that Agent and Role would have to share methods by coincidence.

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

Итак - что лучше всего подходит для моделирования этого? Какие соображения имеют решающее значение для решения, особенно с использованием аналогичных интерфейсов Java 8 и абстрактных классов?

ответ

1

Я хотел бы сделать это следующим образом:

  • Сделаю роль интерфейс, поскольку он не имеет атрибута. Explorer и Инженер будет классом, а не интерфейсом b'coz, как работает стратегия .
  • Игрок и Бот будут связаны с Агентом, чтобы они могли выдать ордера Агенту.

Для меня есть 2 важные соображения при выполнении объектно-ориентированного анализа и проектирования:

  • ли решить мою проблему? Если это так, не исправляйте это! Будущие проблемы предназначены для будущего.
  • Должно быть как можно проще рефакторировать. По мере того как появятся новые требования , вам придется много рефакторинга.

enter image description here

+0

Это справедливо - каковы ваши мысли о необходимости "Туннель" команды через agent.role.move()? Разве это не так грязно, как мне кажется? –

+0

Это приемлемо для меня, поскольку весь смысл заключается в использовании полиморфизма. Но лучше, если Player/Bot должен только вызвать agentInstance.move(). И затем вы делегируете поведение Move() на роль агента (вызывая функцию Role.Move() внутри Agent.Move()). Затем, в зависимости от роли, которую вы даете этому агенту, он будет двигаться по-другому. Но это в основном зависит от бизнеса, который вы моделируете. –