Swing / Java3D应用程序中基于状态的撤消:AOP解决方案?

时间:2012-01-05 15:41:41

标签: java swing aop undo java-3d

我负责维护用Swing编写的旧应用程序,以及用Java3D编写的类似CAD的工具。我们遇到内存使用的问题。分析后,这与应用程序中的撤消功能有关。

所有撤消功能都是基于状态的,具有如下基本概念:

public class UndoAction {
  private UndoTarget target;
  private Object old_data;
  private Object new_data;
}

创建这些UndoActions的代码基本上遍布整个应用程序。因为新对象的修改,现有对象的修改和子树的修改之间没有区别,所以会发生以下情况:

单个动作如下所示:

  • 创建新对象A
  • 修改对象的字段foo。一个新的UndoAction放在堆栈上,其中包含foo_old和foo_new。
  • 修改对象的字段bar。一个新的UndoAction放在堆栈上,其中包含bar_old和bar_new。
  • 执行B.setField(A)。一个新的UndoAction放在堆栈上,其中包含field_old和field_new(== A)。

根本没有粒度或任何控制权。这根本无助于维护。

我想重构这个系统,使其变得可维护且对内存友好。不幸的是,使用Command模式实现Undo系统是不可能的;这些行为太过影响而无法恢复。我想实现以下内容:

  1. 使用注释提供“撤消分界”。 @Undoable()会将方法标记为生成放在堆栈上的UndoAction。这可以像事务一样进行参数化:REQUIRE,NEST,JOIN ......在输入Undoable方法时克隆完整的对象图。
  2. 当Transaction(=方法)结束时,算法应该将新状态与旧状态进行比较并保存差异。
  3. 为了实现这一点,我们可以使用AOP。这使我们能够保持核心代码非常干净。
  4. 现在,我的问题: Java中是否已存在以上3种功能?我可以想象我不是第一个与基于状态的撤销和与之相关的问题(撤销分界,状态比较,......)进行斗争的人。

2 个答案:

答案 0 :(得分:2)

在这个问题已经开放了很长一段时间后,似乎问题是:“不,没有这样的框架已经存在。”

作为其他人的指南,我正在研究Eclipse Modeling FrameworkEMF.Edit框架。在此框架中,您使用描述符语言定义模型,框架为您处理模型和任何操作。这会自动导致创建动作和撤消/重做。

答案 1 :(得分:1)

作为参考,可以作为模型(如果不是解决方案)的另一个框架是UndoManager,它支持有限数量的编辑。它是javax.swing.undo包的一部分,是几个核心Text Component Features之一。