备忘录模式

/ 设计模式

备忘录模式(Memento)

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态

GoF23种设计模式中,属于行为型模式( Behavioral Patterns)

备忘录模式提供了数据的备份功能,以便在数据异常时对数据进行恢复等补救措施。

实例

备忘录模式总览

角色说明

举例

我们以写日记为例,假设日记写错了一句,使用备忘录模式进行回滚。

备忘录模式举例

角色说明

code

public class Diary {

    private String article;

    public String getArticle() {
        return article;
    }

    public void setArticle(String article) {
        this.article = article;
    }

    public DiaryMemento createMemento() {
        return new DiaryMemento(article);
    }

    public void checkoutDiary(Caretaker caretaker) {
        this.article = caretaker.getMemento().getArticle();
    }
}
public class DiaryMemento {

    private String article;

    public DiaryMemento(String article) {
        this.article = article;
    }

    public String getArticle() {
        return article;
    }
}
public class Caretaker {

    private Stack<DiaryMemento> articleStack = new Stack<>();

    public void addMemento(DiaryMemento diaryMemento) {
        articleStack.add(diaryMemento);
    }

    public DiaryMemento getMemento() {
        return articleStack.pop();
    }
}
public class Client {
    public static void main(String[] args) {
        Diary diary = new Diary();
        Caretaker caretaker = new Caretaker();

        //写了个开头,并备忘
        diary.setArticle("啊\n在苍茫的大海上啊\n");
        caretaker.addMemento(diary.createMemento());
        System.out.println("1. 日记内容如下:\n" + diary.getArticle());

        //接着写
        diary.setArticle("啊\n在苍茫的大海上啊\n有一只小小的飞燕");
        System.out.println("2. 日记内容如下:\n" + diary.getArticle());
        System.out.println("(内心:我擦嘞,写错误了,应该是海燕,赶紧撤销)");

        //撤销
        diary.checkoutDiary(caretaker);
        System.out.println("\n3. 撤销后,日记内容如下:\n" + diary.getArticle());

        //接着写,并备份
        diary.setArticle("啊\n在苍茫的大海上啊\n有一只小小的海燕");
        caretaker.addMemento(diary.createMemento());
        System.out.println("4. 继续写日记内容如下:\n" + diary.getArticle());

    }
}
1. 日记内容如下:
啊
在苍茫的大海上啊

2. 日记内容如下:
啊
在苍茫的大海上啊
有一只小小的飞燕
(内心:我擦嘞,写错误了,应该是海燕,赶紧撤销)

3. 撤销后,日记内容如下:
啊
在苍茫的大海上啊

4. 继续写日记内容如下:
啊
在苍茫的大海上啊
有一只小小的海燕

实例

暂无(备忘录模式一般运用于实际业务开发中)

总结

通过备忘录模式,可以在不破坏原有对象封装的前提下,为原对象提供状态恢复查询等功能。但特殊情况下,备忘录模式需要消耗很大的资源。