Memento 模式和 MVC 模式,发起者状态总是重复的?
Memento Pattern and MVC pattern, originator state will be alway duplicated?
我已经开始通过 Memento Pattern 实现撤消和重做,到目前为止我的进展是:
来自 Class 控制器,函数 RGB(...):
void Controller::rgb(int exp, double cont, int r, int g, int b){
originator->setValue(exp, originator->exposure_Val);
originator->setValue(cont, originator->contrast_Val);
originator->setValue(r, originator->red_Val);
originator->setValue(g, originator->green_Val);
originator->setValue(b, originator->blue_Val);
caretaker->setMemento(originator->createMemento());
RGB_process run(model->src, model->dst, exp, cont, r, g, b);
run.doProcess();
model->setValue(exp, cont, r, g, b);
}
无效 Model::setValue(...):
....code that sets values...
notify(); //notify observer, and update the view
那么在我看来,on_undo_btn(...):
void MainWindow::on_undo_btn_clicked()
{
controller->originator->restoreToMemento(controller->caretaker->getMemento());
ui->exposure_slider->setValue(controller->originator->getValue(controller->originator->exposure_Val));
ui->contrast_slider->setValue(controller->originator->getValue(controller->originator->contrast_Val));
ui->red_slider->setValue(controller->originator->getValue(controller->originator->red_Val));
ui->green_slider->setValue(controller->originator->getValue(controller->originator->green_Val));
ui->blue_slider->setValue(controller->originator->getValue(controller->originator->blue_Val));
}
我的问题是:
每次我按下 "undo" btn,因为它会更新滑块值,我的 Memento 将在控制器被触发时重新记录,这样我就有了 2 个相等的动量状态。
现在,这还不错,因为我也想实现一个 "redo",所以我的想法是将这个 "duplicate" 推到我的实际状态前面,以便能够去 "back from the undo"。
我怎样才能实现这样的条件?
换一种方式,在其他地方记录我的 Memento States 更好吗?
控制器现在有一个“bool undoing”值来跳过观察者通知。
我已经开始通过 Memento Pattern 实现撤消和重做,到目前为止我的进展是:
来自 Class 控制器,函数 RGB(...):
void Controller::rgb(int exp, double cont, int r, int g, int b){
originator->setValue(exp, originator->exposure_Val);
originator->setValue(cont, originator->contrast_Val);
originator->setValue(r, originator->red_Val);
originator->setValue(g, originator->green_Val);
originator->setValue(b, originator->blue_Val);
caretaker->setMemento(originator->createMemento());
RGB_process run(model->src, model->dst, exp, cont, r, g, b);
run.doProcess();
model->setValue(exp, cont, r, g, b);
}
无效 Model::setValue(...):
....code that sets values...
notify(); //notify observer, and update the view
那么在我看来,on_undo_btn(...):
void MainWindow::on_undo_btn_clicked()
{
controller->originator->restoreToMemento(controller->caretaker->getMemento());
ui->exposure_slider->setValue(controller->originator->getValue(controller->originator->exposure_Val));
ui->contrast_slider->setValue(controller->originator->getValue(controller->originator->contrast_Val));
ui->red_slider->setValue(controller->originator->getValue(controller->originator->red_Val));
ui->green_slider->setValue(controller->originator->getValue(controller->originator->green_Val));
ui->blue_slider->setValue(controller->originator->getValue(controller->originator->blue_Val));
}
我的问题是: 每次我按下 "undo" btn,因为它会更新滑块值,我的 Memento 将在控制器被触发时重新记录,这样我就有了 2 个相等的动量状态。 现在,这还不错,因为我也想实现一个 "redo",所以我的想法是将这个 "duplicate" 推到我的实际状态前面,以便能够去 "back from the undo"。 我怎样才能实现这样的条件? 换一种方式,在其他地方记录我的 Memento States 更好吗?
控制器现在有一个“bool undoing”值来跳过观察者通知。