我试图执行撤消/重做功能到我的应用程序,使用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零件?
或者还有其他更好的解决方案吗?
感谢您的帮助!