设计模式之美学习-行为型-备忘录模式(三十三)

什么是备忘录模式

在不违背封装原则的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后恢复对象为先前的状态。

需求

编写一个小程序,可以接收命令行的输入。用户输入文本时,程序将其追加存储在内存文本中;用户输入“:list”,程序在命令行中输出内存文本的内容;用户输入“:undo”,程序会撤销上一次输入的文本,也就是从内存文本中将上次输入的文本删除掉。

实现

//输入文本
public class InputText {
    private StringBuilder text = new StringBuilder();

    public String getText() {
        return text.toString();
    }

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

    //创建快照
    public Snapshot createSnapshot() {
        return new Snapshot(text.toString());
    }

    //根据快照还原对象
    public void restoreSnapshot(Snapshot snapshot) {
        this.text.replace(0, this.text.length(), snapshot.getText());
    }
}

//快照类
public class Snapshot {
    private String text;

    public Snapshot(String text) {
        this.text = text;
    }

    public String getText() {
        return this.text;
    }
}
//备忘录
public class SnapshotHolder {
    private Stack<Snapshot> snapshots = new Stack<>();

    public Snapshot popSnapshot() {
        return snapshots.pop();
    }

    public void pushSnapshot(Snapshot snapshot) {
        snapshots.push(snapshot);
    }
}

public class ApplicationMain {
    public static void main(String[] args) {
        //存储输入文本
        InputText inputText = new InputText();
        //备忘录
        SnapshotHolder snapshotsHolder = new SnapshotHolder();
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String input = scanner.next();
            //list 输出 字符
            if (input.equals(":list")) {
                System.out.println(inputText.toString());
                //undo 还原上一个版本
            } else if (input.equals(":undo")) {
                //获得快照
                Snapshot snapshot = snapshotsHolder.popSnapshot();
                //根据快照还原
                inputText.restoreSnapshot(snapshot);
            } else {
                //创建快照 并写入备忘录
                snapshotsHolder.pushSnapshot(inputText.createSnapshot());
                //追加字符
                inputText.append(input);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/LQBlog/p/12739369.html