gpt4 book ai didi

language-agnostic - 撤消/重做与级联删除

转载 作者:行者123 更新时间:2023-12-04 04:39:41 25 4
gpt4 key购买 nike

我正在尝试使用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零件。还通知 View 以更新 View 。 GUI)。

这是我面临的问题:我正在编写undo/redo命令来删除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零件管理器所做的事情)?这意味着撤消/重做命令还将负责通知 View 以更新GUI。

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

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

谢谢你的帮助 !

最佳答案

您需要对此稍作改动:Memento pattern。您可以存储完整的对象树的快照,也可以存储每次更改时的所有差异。有了这些连续的更改历史记录,您就可以通过命令前进和后退,直到心中满意为止,而不会丢失相关的对象。

关于language-agnostic - 撤消/重做与级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/435761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com