我正在尝试使用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部件。还会通知视图更新GUI。)
这是我遇到问题的地方:我正在编写用于删除2D配置文件的undo / redo命令,它看起来像这样(伪代码):
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零件丢失。
我该怎么办? undo / redo命令是否应该负责删除3D部件(这是3d部件管理员实际完成的事情)?这意味着undo / redo命令也负责通知视图更新GUI。
或者,undo / redo命令是否应创建将删除的所有3d部件的内部副本,并让3d部件管理器删除3D部件?
或者还有其他更好的解决方案吗?
感谢您的帮助!
答案 0 :(得分:1)
您希望稍微改变一下:Memento pattern。您可以存储完整对象树的快照,也可以存储每次更改时的所有差异。有了这一连续的变化历史,你就可以通过命令向前和向前进入你的内心,而不会丢失依赖的对象。