2011-07-01 45 views
2

我開始實施命令模式,希望能夠爲我提供撤消操作的問題獲得有用的解決方案。現在我面臨着一定的問題:在Java中實現撤消以進行狀態更改

在涉及操作時實現撤消操作相當容易:當我向數字中添加了5時,我減去了5.當我將一個對象添加到列表中時,它等等。但是如果我有一個完整的狀態而不是一個列表呢?

一個例子:ID

public class ThreadInfo implements Comparable<ThreadInfo> { 

    final int id; 
    String name; 
    int priority; 
    String state; 
    int waitCount; 
    // ... 
} 

的某些信息不改變,比如:我的模型有關的類線程的信息。如上所述,撤消waitCount很簡單,只需減去。但是prioritystate呢?目前還不清楚如何撤銷這些信息。

唯一的想法,我想出了:初始化命令對象時,保存在它的對象老態:由相關的數據傳遞到構造函數:

public MyCommand(int priority, String state) { 
    previousPriority = priority; 
    previousState = state; 
} 

或者倒不如讓ThreadInfo有當前的第一個元素的州和優先級列表?

回答

4

只是在命令中保持舊狀態。例如

class ChangeFoo { 
    ChangeFoo (Bar bar, foo newFoo){} 
    void execute(){ 
     oldFoo = bar.getFoo(); 
     bar.setFoo(newFoo); 
    } 
    void undo(){ 
     bar.setFoo(oldFoo); 
    } 
} 
+0

或者在堆疊上保存一個Collection 。 –

+0

@Hovercraft這是我想到的第二種方法! –

+0

@platzhirsch:這一切都取決於你想要多少級別的撤消。 –

2

我會去第一個解決方案:保存狀態的MyCommand構造函數。這很簡單,應該工作。對於更一般的撤銷/重做方法,請看memento pattern。你可以將它與你的基於命令的方法結合起來。

0

Java已經支持撤銷/重做操作。看看這個tutorial。 您可以擴展AbstractUndoableEdit類來定義對象的撤銷/重做操作的語義。

+2

感謝您指出這個Swing功能,但它似乎只着重於演示文稿。我想撤消/重做我的模型! –

+1

好..只是一個小技巧。 – Heisenbug

0

最好在您的指令方法中備份舊對象。 我已經使用這種類型的方法。