Проблема для моделирования является этим:
Иерархия уровней в Army
, Начиная с национальной армии полностью, через полевые армии, подблоки и в конечном счете отдельных мужчин. Каждый уровень может включить ссылки на один или несколько других классов такой как General
или Officer
или что бы то ни было. Единицы в говорят, что полевая армия должна смочь общаться друг с другом, специально для целей смоделировать моральный дух, сцепление, и т.д., а также с теми из любой вражеской полевой армии (например, маршрутизация единицы в моей армии влияет на вражеский моральный дух положительно). Кроме того, каждая единица должна общаться с теми, которые выше и ниже ее в иерархии (в очевидных целях).
Я думал о наличии ссылок в физической иерархии, представленной фактическими указателями (возможно двусторонний) в каждом из классов этих объектов (например. army*
в каждой единице и unit*
или целый набор их в каждой армии) и затем использование шаблона разработки наблюдателя для реализации любой коммуникации в других случаях (таких как случай я упомянул выше).
Однако не будучи никаким экспертом в шаблонах разработки или программируя в этом отношении я не знаю, существует ли какой-либо другой более эффективный способ, чтобы сделать это. Любая справка значительно ценилась бы.
Существует модель / шаблон проектирования для передачи событий между разрозненными объектами, которые могут не знать о существовании друг друга до того, как произойдет обмен данными. Шаблон называется «Опубликовать / подписаться».
Каждая сущность отправляет события, которые она хочет опубликовать, брокеру и сообщает брокеру о том, какие типы событий ей могут быть интересны. Брокер обеспечивает, чтобы подписывающиеся организации узнавали о публикуемых событиях, которые они находят интересными.
Это похоже на шаблон Observer, но в шаблоне Observer каждая заинтересованная сущность подписывается индивидуально на каждую сущность, от которой ей нужны события. Я думаю, что это может привести к большим накладным расходам, потому что это требует от всех заботы о создании и разрушении вещей.
В любом случае, есть хорошая статья в Википедии о публикации / подписке .
Я бы использовал шаблон Composite (что в основном означает дерево некоторой формы) для отдельных армий. И, возможно, Наблюдатель для отношений вверх и вниз по иерархии или с братьями и сестрами. Но Observer требует слишком много времени для регистрации и отмены регистрации, чтобы работать в общем случае.
Для моделирования структуры это выглядит как классическое применение паттерна Composite. Затем вы можете использовать Visitor или Interpreter для моделирования операций над субъединицами.
Похоже на синдром «маленького мальчика с узором». Вы ищете шаблон вместо того, чтобы думать о своей проблеме.
Естественной структурой данных для иерархии является дерево. Я бы начал с этого.
Если требуется, чтобы каждая единица в дереве взаимодействовала со всеми остальными, я бы сказал, что Observer не для вас. Каждая единица должна быть зарегистрирована со всеми остальными. Каждый раз, когда запускается событие, у вас будет N-квадратная огненная буря сообщений.
Посредник может быть лучше. Юниты будут отправлять события посреднику, позволяя потребителям регистрировать свою заинтересованность в получении определенного типа сообщения. Производители и потребители знают только о посреднике, а не друг о друге. Слабая связь - ваш друг.