明らかに変更の履歴の配列を格納するために多くのメモリを取る...それは私が働いて自分のアプリケーションを持っていた方法ですが、これを行うことについて移動するよりスマートな方法がありますようにそれはちょうどそうです。写真編集アプリケーションで「元に戻す」機能を実装する最善の方法は何ですか?
ArrayList<Photo> photoHistory = new ArrayList<>();
photoHistory.add(originalPhoto);
photoHistory.add(change1);
photoHistory.add(change2);
// bad implementation - lots of memory
オリジナルのビューモデルと現在のビューモデルのみを保存し、使用するメソッド/フィルタのログを保持することはありますか?ユーザーが「元に戻す」とヒットした場合、変更の総数がもう一度マイナス1になります。これはまた非常に非効率的なようです。
私はちょうどソフトウェア・アプリケーションの機能を「元に戻す」一般を実装する方法についてアドバイスを探していますね。ここで
https://en.wikipedia.org/wiki/Command_pattern –
変更を逆に新しいバージョンに適用するには、後と変更前の間、すなわちデルタデルタを計算します。歴史はその三角です。完全なフィルタの場合、完全な画像になる可能性がありますが、赤目フィルタのようなものは、目だけです。つまり、はるかに小さくなります。 – Andreas
まあ、@AndyTurnerによってリンクコマンドパターンは、あなただけの一般的な元に戻す機能を持つようにしたい場合は、一般的にフォローする微細なパターンです。しかし、グラフィックアプリケーションのシナリオでは非常に複雑になるのは、(すべてのコマンドに追加する必要がある)元に戻すメソッド自体です。コマンドで取り消しを実装するのは簡単ではないかもしれません。あなたが言及したように、実行されたコマンドのリストを保持し、最後のコマンドを元に戻すときに前のコマンドを再適用することができます。それでも、これは非常に非効率的なことがあります。一般的なシナリオでは、コマンドパターンは大丈夫ですが、グラフィカルエディタでは最適なオプションではないかもしれません。 –