2009-01-12 62 views
8

我试图执行撤消/重做功能到我的应用程序,使用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部分automaticaly删除过(当一个轮廓是即将被删除,一个3D零件管理器被通知,并会删除过时的3D部分。视图也会通知更新GUI)。

这是我现在面临一个问题:我写了撤销/删除一个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零件?

或者还有其他更好的解决方案吗?

感谢您的帮助!

回答

1

你想对此稍作变化:Memento pattern。您可以存储完整对象树的快照,也可以存储每次更改时的所有差异。随着这个连续的历史变化,你可以通过命令向后和向前进入你的内容,而不会丢失依赖对象。