Используя комбинированный шаблон проектирования для работы с объектами различного типа, есть ли способ предотвратить использование объекта более одного раза? - PullRequest
0 голосов
/ 10 декабря 2010

Я хотел бы использовать шаблон проектирования Composite в C ++, чтобы иметь возможность создавать группы объектов и работать с ними. Проблема, с которой я столкнулся, состоит в том, что, поскольку листья и композиты обрабатываются одинаково, а композиты могут состоять из листьев и композитов, вполне возможно, что объект может работать более одного раза, когда команда передается в композит.

Например, составная группа1 содержит объекты A и B. Затем создается составная группа2, содержащая составную группу1 и объект A. При работе с составной группой2 объект A будет работать дважды. Я полагаю, что для некоторых приложений это не проблема, но для моего использования я бы хотел, чтобы для любой команды, выданной составному, уникальные объекты обрабатывались только один раз.

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

-

Обновление: Под «идиоматическим» я подразумеваю «традиционный» или «принятый» способ решения этого типа проблемы. Я предполагаю, что просто предполагаю / надеюсь, что это распространенная проблема, которая имеет устоявшееся решение.

1 Ответ

1 голос
/ 10 декабря 2010

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

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