行为型(八) - 备忘录模式

一、概念

备忘录模式(Memento Pattern):也叫快照(Snapshot)模式,在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。通俗点就是用于保存某个对象的状态,以便在适当的时候恢复对象。简单的应用比如:游戏存档、浏览器中的后退、word中的撤销。

二、实现

这里举一个word中添加撤销的例子。
1、Word

public class Word {
    
    
    StringBuilder content = new StringBuilder();
    public String getContent() {
    
    
        return content.toString();
    }

    public void append(String input) {
    
    
        content.append(input);
    }

    public WordMemento createWordMemento() {
    
    
        return new WordMemento(content.toString());
    }
    
    public void restoreWordMemento(WordMemento wordMemento) {
    
    
        content.replace(0, content.length(), wordMemento.getContent());
    }
}

2、WordMemento表示word操作过程状态,该数据一旦创建不能留修改入口。

public class WordMemento {
    
    
    private String content;
    public WordMemento(String content) {
    
    
        this.content = content;
    }

    public String getContent() {
    
    
        return content;
    }
}

3、WordMementoHolder状态控制类

public class WordMementoHolder {
    
    
    private Stack<WordMemento> stack = new Stack<>();
    private static class WordMementoHolderSingleton {
    
    
        private static final WordMementoHolder INSTANCE = new WordMementoHolder();
    }

    public static WordMementoHolder getInstance() {
    
    
        return WordMementoHolderSingleton.INSTANCE;
    }

    public void pushWordMemento(WordMemento wordMemento) {
    
    
        stack.push(wordMemento);
    }

    public WordMemento popWordMemento() {
    
    
        return stack.pop();
    }

    public WordMemento getStackTopMemento(){
    
    
        return stack.peek();
    }
}

4、测试类

public class Client {
    
    
    public static void main(String[] args) {
    
    
        WordMementoHolder wordMementoHolder = WordMementoHolder.getInstance();
        Word word = new Word();

        String str1 = "hello";
        String str2 = "123";
        String str3 = "java";

         //添加第一个
        word.append(str1);
        wordMementoHolder.pushWordMemento(word.createWordMemento());
        System.out.println(word.getContent());

        //添加第二个
        word.append(str2);
        wordMementoHolder.pushWordMemento(word.createWordMemento());
        System.out.println(word.getContent());

        //添加第三个
        word.append(str3);
        wordMementoHolder.pushWordMemento(word.createWordMemento());
        System.out.println(word.getContent());

        //撤销第三个
        wordMementoHolder.popWordMemento();
        word.restoreWordMemento(wordMementoHolder.getStackTopMemento());
        System.out.println(word.getContent());
    }
}

5、运行结果
备忘录模式结果.png

猜你喜欢

转载自blog.csdn.net/kongqwesd12/article/details/132403609