通过制作 '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
包含要恢复的对象的实际状态。 Originator
在 Memento
个对象中创建和存储状态,Caretaker
对象负责从 Memento
个对象的集合中恢复对象的状态。
我想为图像编辑器构建撤消和重做 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
包含要恢复的对象的实际状态。 Originator
在 Memento
个对象中创建和存储状态,Caretaker
对象负责从 Memento
个对象的集合中恢复对象的状态。