我正在尝试使用命令模式在我的应用程序中实现撤消/重做功能。我面临一个问题。
为了说明这一点,让我们假设您可以使用我的应用程序创建 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 零件?
还是有其他更好的解决方案?
谢谢你的帮助 !