通过制作 'state snapshot' 来构建撤消和重做

Build an Undo & Redo by making a 'state snapshot'

我想为图像编辑器构建撤消和重做 class,而不构建整个命令模式。

实际上在我的代码中,我使用的是 MVC 模式,所以我得到了一堆属性,每次我启动一个动作时都会更新这些属性:

    class model{
    ...code...

public:
        bool is_Flipped_V = false;
        bool is_Flipped_H = false;
        bool is_Rotated = false;
        bool is_Blurred = false;
        bool is_Sharpened = false;
        bool is_Grayscale = false;
        bool is_Sepia = false;
        bool is_Loaded = false;
        bool is_Saved = false;


        int exposure_Val;
        double contrast_Val;
        int red_Val;
        int green_Val;
        int blue_Val;

        int hue_Val;
        int saturation_Val;
        int luminance_Val;

        int angle_Val;
    }

我的想法是创建一个列表,每次通知Observer时,它记录所有上层属性的实际状态。 因此,当我想要 'undo' 某些东西时,我可以通过传递先前的属性状态来重新更新我的图像。

有人做过类似的事情吗?如何将属性的状态保存在列表中? 有没有不同但更好的方法来实现它?

作为一个起点,一个天真的实现可能是将所有属性放在一个 State 结构中,并在 Undo/Redo class。然后,当您弹出 undo 堆栈以撤消 State 时,您将弹出的相同 State 压入 redo 堆栈。当你重做一个 State 时,你做同样的事情。您弹出 redo 堆栈并将弹出的 State 推回 undo 堆栈。

还记得在将新更改推送到 undo 堆栈时清除 redo 堆栈。

实施 Undo/Redo 的首选方法是遵循 Memento Pattern。它存储每个不可撤销的操作,并允许跳转到历史上的任何随机点。这是一个简单干净的模式,有助于实现此功能。

Memento 模式使用三个角色 类。 Memento 包含要恢复的对象的实际状态。 OriginatorMemento 个对象中创建和存储状态,Caretaker 对象负责从 Memento 个对象的集合中恢复对象的状态。