Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 使用级联删除撤消/重做_Language Agnostic_Design Patterns_Undo - Fatal编程技术网

Language agnostic 使用级联删除撤消/重做

Language agnostic 使用级联删除撤消/重做,language-agnostic,design-patterns,undo,Language Agnostic,Design Patterns,Undo,我正在尝试在我的应用程序中实现撤销/重做功能,使用。我面临一个问题 为了说明这一点,让我们假设您可以使用我的应用程序创建2D配置文件(任意数量) 然后,可以从这些二维轮廓创建具有不同属性(名称、颜色、比例等)的三维零件 删除配置文件时,在此配置文件上构建的所有三维零件也将自动删除(当要删除配置文件时,会通知三维零件管理器并将删除过时的三维零件。还会通知视图更新GUI) 这就是我面临的一个问题:我正在编写用于删除二维概要文件的undo/redo命令,它看起来像这样(伪代码): 正如您在上面的代码中

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

为了说明这一点,让我们假设您可以使用我的应用程序创建2D配置文件(任意数量)

然后,可以从这些二维轮廓创建具有不同属性(名称、颜色、比例等)的三维零件

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

这就是我面临的一个问题:我正在编写用于删除二维概要文件的undo/redo命令,它看起来像这样(伪代码):

正如您在上面的代码中所看到的,删除二维轮廓将自动删除依赖于已删除轮廓的所有三维零件

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

我该怎么办?“撤消/重做”命令是否应负责删除三维零件(这实际上是由三维零件管理器完成的)?这意味着undo/redo命令还负责通知视图更新GUI

或者“撤消/重做”命令是否应创建将被删除的所有三维零件的内部副本,并让三维零件管理器删除三维零件

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


谢谢你的帮助

您希望在这一点上有一点变化:即。可以存储完整对象树的快照,也可以只存储每次更改时的所有差异。有了这些连续的变化历史,您就可以通过命令返回并前进到您的内心内容,而不会丢失依赖对象

+--------------+              +--------------+      +--------------+
| 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%  |
+--------------*
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
}