首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用级联删除进行撤消/重做

使用级联删除进行撤消/重做
EN

Stack Overflow用户
提问于 2009-01-12 15:31:28
回答 1查看 719关注 0票数 9

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

为了说明这一点,假设您可以使用我的应用程序创建2D配置文件(想要多少就创建多少)。

从这些2D配置文件中,您可以创建具有不同属性(名称、颜色、比例等)的3D零件。

代码语言:javascript
复制
+--------------+              +--------------+      +--------------+
| 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命令,它看起来像这样(伪代码):

代码语言:javascript
复制
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零件。

但是,在执行撤消操作时,仅将二维截面轮廓重新添加到列表中是不够的:三维零件将丢失。

我该怎么做?撤销/重做命令是否应负责删除3D零件(这实际上是由3d零件管理器完成的操作)?这意味着undo/redo命令还将负责通知视图更新GUI。

还是应该使用undo/redo命令创建将被删除的所有3d零件的内部副本,并让3d零件管理器删除这些3D零件?

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

感谢您的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-01-12 16:28:17

您需要在此基础上做一个细微的变化:Memento pattern。您可以存储整个对象树的快照,也可以只存储每个更改时的所有差异。有了这个连续的变化历史,您就可以通过命令向前和向后前进,而不会丢失依赖的对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/435761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档