Я пытаюсь внедрить функцию отмены/возврата в свое приложение, используя Шаблон команды. Я столкнулся с проблемой.
Чтобы проиллюстрировать это, давайте представим, что вы можете создавать с помощью моего приложения 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-детали?
Или есть другое лучшее решение?
Спасибо за вашу помощь !