Я пытаюсь внедрить функцию отмены / возврата в свое приложение, используя Шаблон команды . У меня проблема.
Чтобы проиллюстрировать это, давайте представим, что вы можете создавать с моим приложением 2D-профили (сколько угодно).
Из этих 2D профилей вы можете затем создать трехмерную деталь с различными атрибутами (имя, цвет, масштаб и т. Д.).
+--------------+ +--------------+ +--------------+
| 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-детали теряются.
Что мне делать? Должна ли команда undo / redo отвечать за удаление 3D-деталей (что на самом деле делает менеджер 3D-деталей)? Это будет означать, что команда undo / redo также будет ответственна за уведомление представлений об обновлении GUI.
Или команда undo / redo должна создать внутреннюю копию всех трехмерных деталей, которая будет удалена, и позволить менеджеру трехмерных деталей удалить трехмерные детали?
Или есть другое лучшее решение?
Спасибо за вашу помощь!