3

元に戻す操作を提供するという私の問題に対する有用な解決策を得ることを期待して、コマンドパターンの実装を開始しています。今、私は特定の問題に直面しています:

操作が含まれる場合のundoの実装はかなり簡単です。数値に5を加算した後、5を減算します。リストにオブジェクトを追加した後、それを削除します。しかし、リストのようなものではなく、全体的な状態がある場合はどうなりますか?

例:クラス内のスレッドに関する情報をモデル化します。

public class ThreadInfo implements Comparable<ThreadInfo> {

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

IDなど、特定の情報は変更されません。waitCount上記のように、元に戻すのは簡単です。減算するだけです。しかし、どうpriorityですかstate?これらの情報を元に戻す方法は明確ではありません。

私が思いついた唯一のアイデア:コマンドオブジェクトを初期化するとき、そのオブジェクトの古い状態を保持します:関連するデータをコンストラクターに渡すことによって:

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

ThreadInfoそれとも、現在の最初の要素である状態と優先順位のリストを持っている方が良いでしょうか?

4

4 に答える 4

5

コマンドで古い状態を保持するだけです。例えば

 class ChangeFoo {
    ChangeFoo (Bar bar, foo newFoo){}
    void execute(){
        oldFoo = bar.getFoo();
        bar.setFoo(newFoo);
    }
    void undo(){
        bar.setFoo(oldFoo);
    }
 }
于 2011-07-01T11:22:06.323 に答える
2

私は最初の解決策に行きます:状態を保存するMyCommandコンストラクター。シンプルで動作するはずです。より一般的な元に/やり直しのアプローチについては、mementoパターンをご覧ください。おそらく、コマンドベースのアプローチと組み合わせることができます。

于 2011-07-01T11:21:10.837 に答える
0

Javaはすでに元に/やり直し操作をサポートしています。このチュートリアルをご覧ください。AbstractUndoableEditクラスを拡張して、オブジェクトに対する元に戻す/やり直し操作のセマンティクスを定義できます。

于 2011-07-01T11:21:21.407 に答える
0

comandメソッドの横に古いオブジェクトのバックアップを作成することをお勧めします。私はすでにこのタイプのアプローチを使用しました。

于 2011-07-01T12:00:31.170 に答える