Language agnostic 使用级联删除撤消/重做
我正在尝试在我的应用程序中实现撤销/重做功能,使用。我面临一个问题 为了说明这一点,让我们假设您可以使用我的应用程序创建2D配置文件(任意数量) 然后,可以从这些二维轮廓创建具有不同属性(名称、颜色、比例等)的三维零件 删除配置文件时,在此配置文件上构建的所有三维零件也将自动删除(当要删除配置文件时,会通知三维零件管理器并将删除过时的三维零件。还会通知视图更新GUI) 这就是我面临的一个问题:我正在编写用于删除二维概要文件的undo/redo命令,它看起来像这样(伪代码): 正如您在上面的代码中所看到的,删除二维轮廓将自动删除依赖于已删除轮廓的所有三维零件 但在执行“撤消”时,仅将二维轮廓重新添加到列表中是不够的:三维零件将丢失 我该怎么办?“撤消/重做”命令是否应负责删除三维零件(这实际上是由三维零件管理器完成的)?这意味着undo/redo命令还负责通知视图更新GUI 或者“撤消/重做”命令是否应创建将被删除的所有三维零件的内部副本,并让三维零件管理器删除三维零件 还是有其他更好的解决方案Language agnostic 使用级联删除撤消/重做,language-agnostic,design-patterns,undo,Language Agnostic,Design Patterns,Undo,我正在尝试在我的应用程序中实现撤销/重做功能,使用。我面临一个问题 为了说明这一点,让我们假设您可以使用我的应用程序创建2D配置文件(任意数量) 然后,可以从这些二维轮廓创建具有不同属性(名称、颜色、比例等)的三维零件 删除配置文件时,在此配置文件上构建的所有三维零件也将自动删除(当要删除配置文件时,会通知三维零件管理器并将删除过时的三维零件。还会通知视图更新GUI) 这就是我面临的一个问题:我正在编写用于删除二维概要文件的undo/redo命令,它看起来像这样(伪代码): 正如您在上面的代码中
谢谢你的帮助 您希望在这一点上有一点变化:即。可以存储完整对象树的快照,也可以只存储每次更改时的所有差异。有了这些连续的变化历史,您就可以通过命令返回并前进到您的内心内容,而不会丢失依赖对象
+--------------+ +--------------+ +--------------+
| 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
}