记忆模式和MVC模式,始发者状态将始终重复吗?

时间:2019-07-11 09:53:23

标签: c++ qt model-view-controller design-patterns memento

我已经开始通过Memento模式实现撤消和重做,到目前为止,我的进展是:

从类控制器,功能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);
}

无效模型:: 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));
}

我的问题是: 每次我按“撤消” btn时,它会更新滑块值,当控制器被触发时,我的Memento将被重新记录,这样我的动量就有两个相等的状态。 现在,这一点都还不错,因为我也想实现一个“重做”,所以我的想法是将这个“重复的”推到我的实际状态之前,以便能够“从撤消中退回”。 ”。 如何实现这种条件? 改变方法并在其他地方记录我的记忆状态是否更好?

1 个答案:

答案 0 :(得分:0)

控制器现在具有“ bool undoing”值,以跳过观察者通知。