很明顯,它需要大量的內存來存儲更改歷史數組......這就是我如何讓我的應用程序工作,但似乎有一個更聰明的方法來做到這一點。在照片編輯應用程序中實現「撤消」功能的最佳方式是什麼?
ArrayList<Photo> photoHistory = new ArrayList<>();
photoHistory.add(originalPhoto);
photoHistory.add(change1);
photoHistory.add(change2);
// bad implementation - lots of memory
也許只存儲原始視圖模型和當前視圖模型,並保存使用的方法/過濾器的日誌?那麼,當用戶點擊「撤消」時,它會將所做的更改總數再次減去一個?這似乎也非常低效。
我想我只是在尋找關於如何實現一個軟件應用程序的一般'撤銷'功能的建議。
https://en.wikipedia.org/wiki/Command_pattern –
計算變更之前和之後的增量,即應用於新版本以反轉變化的增量。歷史就是那些三角洲。對於完整的濾鏡,可能是完整的圖片,但對於紅眼濾鏡之類的東西,它只是眼睛,即小得多。 – Andreas
那麼,通過@AndyTurner鏈接的命令模式是一個很好的模式,如果你只是想擁有一個通用的撤銷功能,那麼這個模式通常會遵循。但是,在圖形應用程序場景中,它的複雜性在於撤消方法本身(需要將其添加到每個命令中)。在命令中實現撤消可能並不那麼容易。正如你所提到的那樣 - 你可以保存已執行命令的列表,並在撤銷最後一個命令時重新應用以前的命令。不過,這可能效率很低。因此,總結一下 - 在一般情況下,命令模式可以,但可能不是圖形編輯器中的最佳選項。 –