我正在尝试使用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零件。
但是,在执行撤消操作时,仅将二维截面轮廓重新添加到列表中是不够的:三维零件将丢失。
我该怎么做?撤销/重做命令是否应负责删除3D零件(这实际上是由3d零件管理器完成的操作)?这意味着undo/redo命令还将负责通知视图更新GUI。
还是应该使用undo/redo命令创建将被删除的所有3d零件的内部副本,并让3d零件管理器删除这些3D零件?
或者还有其他更好的解决方案?
感谢您的帮助!
发布于 2009-01-12 16:28:17
您需要在此基础上做一个细微的变化:Memento pattern。您可以存储整个对象树的快照,也可以只存储每个更改时的所有差异。有了这个连续的变化历史,您就可以通过命令向前和向后前进,而不会丢失依赖的对象。
https://stackoverflow.com/questions/435761
复制相似问题