3

ある種の二分木構造のエディターを開発していますが、元に戻す機能が必要です。これを実現するためにコマンドパターンを使用することを考えました。しかし、二分木構造でコマンドパターンを使用する方法をまだ見つけることができませんでした。

二分木構造は、ポインタを介して構成されています。したがって、ノードはその親とその子を知っています。ここでノードを追加したい場合NodeAddは、親をパラメーターとしてオブジェクトを作成し、それをに渡しますUndoStack。既存のノードを削除するために、オブジェクトはasパラメーターへのポインターとともにNodeRemoveに渡されます。との両方を実装する必要があります(オブジェクトがに置かれるときに呼び出される場所)。UndoStackNodeNodeAddNodeRemoveundo()redo()redo()UndoStack

私が直面している問題は、ノードの削除とその後の同じノードの追加を元に戻す必要がある状況に対処することです。

  1. NodeAddをやり直します
  2. NodeRemoveをやり直します
  3. NodeRemoveを元に戻す
  4. NodeAddを元に戻す

REDO NodeRemoveが実行されると、Nodeオブジェクトは破棄されます。undo NodeRemoveで新しいNodeオブジェクトを再構築できますが、新しく構築されたへのポインターがないため、undoNodeAddを実行できませんでしたNode

コマンドパターンを間違った方法で使用しようとしていると思います。/内ではなく、コマンドのコンストラクタ/Nodeデストラクタ内ではなく、オブジェクトを破棄または構築する必要があります。残念ながら、この種の構造でこれを行う方法がわかりません。私が見つけたすべての例とアドバイスは、テキスト編集またはポインターを使用した動的構造がないものの編集に関連しています。undo()redo()

この問題に取り組む方法について何かアイデアはありますか?

4

3 に答える 3

1

コマンドパターンは、元に戻すにはおそらく十分ではありません。元に戻すには、mementoパターンを使用する必要があります。

于 2012-10-26T13:59:51.510 に答える
1

1つのオプションは、オブジェクトが、変動する可能性のあるメモリアドレスではなく、Command一意の識別子(たとえば、として表されるインデックス)によってオペランドを参照するようにすることです。size_t

次に、unordered_map< size_t, Node* >どこか(たとえばの静的メンバーNode)を維持するCommandことにより、オブジェクトは特定の現在の実施形態を取得し、Node必要に応じてそれを追加/削除/操作できます。

于 2012-10-26T14:28:58.470 に答える
0

パターンは、それ自体の中でさえ組み合わせることができます。コマンドにexecuteメソッドとundoメソッドの両方を指定します。コマンドが呼び出されたら、インスタンスを双方向の責任の連鎖に入れ、元に戻すとやり直しの方向とメソッドを用意します。

于 2012-10-26T19:20:18.447 に答える