undo / redo with cascading deletion

时间:2009-01-12 15:31:28

标签: language-agnostic design-patterns undo

我正在尝试使用Command Pattern在我的应用程序中实现撤消/重做功能。我正面临着一个问题。

为了说明这一点,让我们假设您可以使用我的应用程序创建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部件。还会通知视图更新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
}

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

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

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

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

或者还有其他更好的解决方案吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您希望稍微改变一下:Memento pattern。您可以存储完整对象树的快照,也可以存储每次更改时的所有差异。有了这一连续的变化历史,你就可以通过命令向前和向前进入你的内心,而不会丢失依赖的对象。