отменить/повторить с каскадными удалениями

Я пытаюсь внедрить функцию отмены/возврата в свое приложение, используя Шаблон команды. Я столкнулся с проблемой.

Чтобы проиллюстрировать это, давайте представим, что вы можете создавать с помощью моего приложения 2D-профили (столько, сколько хотите).

Затем из этих 2D-профилей можно создать 3D-деталь с различными атрибутами (имя, цвет, масштаб и т. д.).

+--------------+              +--------------+      +--------------+
| 2D profile A |              | 2D profile B |      | 2D profile C |
+--------------+              +--------------+      +--------------+
   |    |                            |
   |  +---------------+      +---------------+
   |  | 3D Part B     |      | 3D Part C     |
   |  | Colour : blue |      | Colour : grey |
   |  | Name : bibi   |      | Name : foo    |
   |  | Scale : 33%   |      | Scale : 100%  |
   |  +---------------+      +---------------+
+--------------+
| 3D Part A    |
| Colour : red |
| Name : aaa   |
| Scale : 50%  |
+--------------*

Когда профиль удаляется, все 3D-детали, построенные на этом профиле, также автоматически удаляются (когда профиль собирается быть удаленным, менеджер 3D-деталей уведомляется и удаляет устаревшие 3D-детали. Виды также уведомляются об обновлении графический интерфейс).

Здесь я столкнулся с проблемой: я пишу команду отмены/повторения для удаления 2D-профиля, которая выглядит примерно так (псевдокод):

virtual void redo()
{
    m_pProfileList.remove(m_pProfile); // This will automatically delete all 3D parts relying on the deleted 2D profile
}

virtual void undo()
{
   m_pProfileList.add(m_pProfile); // This will add the 2D profile, but the 3D Parts are lost
}

Как видно из приведенного выше кода, удаление 2D-профиля автоматически удалит все 3D-части, зависящие от удаленного профиля.

Но при отмене повторного добавления 2D-профиля в список недостаточно: 3D-части теряются.

Что я должен делать ? Должна ли команда отмены/возврата отвечать за удаление 3D-деталей (что на самом деле делает менеджер 3D-деталей)? Это будет означать, что команда отмены/повторения также будет отвечать за уведомление представлений об обновлении графического интерфейса.

Или команда отмены/возврата должна создать внутреннюю копию всех 3D-деталей, которые будут удалены, и позволить диспетчеру 3D-деталей удалить 3D-детали?

Или есть другое лучшее решение?

Спасибо за вашу помощь !


person Jérôme    schedule 12.01.2009    source источник


Ответы (1)


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

person GaryF    schedule 12.01.2009