undo/redo with cascading deletion

Jér*_*ôme 9 language-agnostic design-patterns undo

我正在尝试使用命令模式在我的应用程序中实现撤消/重做功能.我遇到了问题.

为了说明它,让我们假设您可以使用我的应用程序创建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%  |
+--------------*
Run Code Online (Sandbox Code Playgroud)

删除配置文件时,也会自动删除构建在此配置文件上的所有3D部件(当要删除配置文件时,将通知3D部件管理器并删除过时的3D部件.还会通知视图以更新GUI).

这是我遇到问题的地方:我正在编写用于删除2D配置文件的undo/redo命令,它看起来像这样(伪代码):

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
}
Run Code Online (Sandbox Code Playgroud)

正如您在上面的代码中看到的,删除2D配置文件将自动删除依赖于删除的配置文件的所有3D部件.

但是在进行撤消时,将2D轮廓重新添加到列表是不够的:3D零件丢失了.

我该怎么办 ?undo/redo命令是否应该负责删除3D部件(这是3d部件管理员实际完成的事情)?这意味着undo/redo命令也将负责通知视图以更新GUI.

或者undo/redo命令是否应创建将删除的所有3d部件的内部副本,并让3d部件管理器删除3D部件?

还是有另一个更好的解决方案?

谢谢你的帮助 !

Gar*_*ryF 2

您想要对此稍有变化:Memento 模式。您可以存储完整对象树的快照,也可以仅存储每次更改时的所有差异。有了这些连续的变化历史,您就可以根据您的喜好来回前进和后退,而不会丢失依赖的对象。