Какой шаблон дизайна использовать? - PullRequest
6 голосов
/ 28 июня 2010

Проблема модели заключается в следующем:

Иерархия уровней в пределах Army, начиная с национальной армии в целом, через полевые армии, подразделения и, в конечном итоге, отдельных людей.Каждый уровень может включать ссылки на один или несколько других классов, таких как General или Officer или любой другой.Отряды внутри говорят, что полевая армия должна иметь возможность общаться друг с другом, особенно в целях моделирования морали, сплоченности и т. Д., А также с подразделениями любой вражеской полевой армии (например, направление подразделений в моей армии влияет на мораль противника).положительно).Кроме того, каждый блок должен общаться с теми, кто выше и ниже его в иерархии (для очевидных целей).

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

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

Ответы [ 3 ]

3 голосов
/ 28 июня 2010

Существует модель / схема проектирования для передачи событий между разнородными сущностями, которые могут не знать о существовании друг друга до того, как произойдет связь.Шаблон называется «Публикация / подписка».

Каждая сущность отправляет брокеру события, которые она хочет опубликовать, и сообщает брокеру о том, какие события она будет заинтересована. Брокер обрабатывает проверку подписывающихся сущностей.узнавать о событиях, которые они находят интересными и которые публикуются.

Это похоже на шаблон Observer, но в шаблоне Observer каждый заинтересованный объект подписывается индивидуально на каждый объект, от которого он хочет получить события.Я думаю, что это может привести к большим накладным расходам, потому что это требует от всех заботы о создании и уничтожении вещей.*

Я бы использовал шаблон Composite (который в основном означает дерево некоторой формы) для отдельных армий.И, возможно, Наблюдатель за отношениями вверх и вниз по иерархии или с братьями и сестрами.Но Observer требует слишком много регистрации и отмены регистрации, чтобы он работал в общем случае.

3 голосов
/ 28 июня 2010

Звучит как синдром "Маленький мальчик с узором". Вы ищете шаблон вместо того, чтобы думать о своей проблеме.

Естественной структурой данных для иерархии является дерево. Я бы начал с этого.

Если требуется, чтобы каждая единица в дереве общалась со всеми остальными, я бы сказал, что Observer не для вас. Каждое подразделение должно быть зарегистрировано со всеми остальными. Вы будете получать N-квадратную огненную бурю сообщений каждый раз, когда происходит событие.

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

1 голос
/ 28 июня 2010

Для моделирования структуры это выглядит как классическое применение шаблона Composite .Затем вы можете использовать Visitor или Interpreter для моделирования операций над подразделениями.

...