阅读 153

memento-备忘录模式

原文链接: www.jianshu.com

解决问题

备忘录模式-即对象的状态记录在备忘录中,以方便可以将在未来的某一时刻或者某一状态中将对象恢复至历史的某一状态。

应用场景

在某种状态下需要回滚到之前的状态。这种应用场景很多:编辑器的自动保存与恢复功能;事务中的回滚机制;各操作平台的回退功能等。

原理图

image

Caretaker: 守护者

Originator:起源,即需要被 “备忘”的对象

Memento:备忘录

“守护者”保护持有操作“起源”,令其生产“备忘录”,并操作多个“备忘录”以方便“起源”回滚(我认为该原理图有问题,如果认为我理解有误请留言)

我的理解是这样的:

备忘录不能由“Originator” 以外的任何对象生成,也不可被“Originator”以外的任何对象修改;因此,“Memento”应该是“Originator”的一个私有的内部类,否则的话前提条件不成立。

“Caretaker” 应该是持有“Originator”,因为它的作用范围是操作对象状态的变更、生产备忘记录(也可以自动生产)、回滚。

image

示例

比较简单的示例,直接用原理图来代表示例

@Data
@AllArgsConstructor
public class Originator {
    private int state;
    private static Stack<Memento> mementos = new Stack<>();
​
    public void save() {
        mementos.push(new Memento(state));
    }
​
    public boolean rollback() {
        if (mementos.isEmpty()) {
            System.out.println("无历史记录");
            return false;
        } else {
            this.state = mementos.pop().getState();
            System.out.println(this.state);
            return true;
        }
    }
​
    @Data
    @AllArgsConstructor
    private static class Memento {
        private int state;
    }
}
​
​
public class CareTaker {
    public static void main(String[] args) {
        Originator originator = new Originator(0);
        originator.save();
        originator.setState(1);
        originator.save();
        originator.setState(2);
        originator.save();
        // 多次回滚
        while (originator.rollback()) {
          ;
        }
    }
}
复制代码

参考

en.wikipedia.org/wiki/Mement…