9

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

为了说明这一点,让我们假设您可以使用我的应用程序创建 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 零件管理器完成的)?这意味着撤消/重做命令也将负责通知视图更新 GUI。

还是应该撤消/重做命令创建所有将被删除的 3d 零件的内部副本,并让 3d 零件管理器删除 3D 零件?

还是有其他更好的解决方案?

谢谢你的帮助 !

4

1 回答 1

1

您需要对此稍作改动:Memento 模式。您可以存储完整对象树的快照,也可以存储每次更改时的所有差异。有了这些连续变化的历史,您就可以通过命令来回前进,让您心满意足,而不会丢失依赖对象。

于 2009-01-12T16:28:17.237 回答