zoukankan      html  css  js  c++  java
  • 设计模式之美学习-行为型-备忘录模式(三十三)

    什么是备忘录模式

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

    需求

    编写一个小程序,可以接收命令行的输入。用户输入文本时,程序将其追加存储在内存文本中;用户输入“: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);
                }
            }
        }
    }
  • 相关阅读:
    Redis之七种武器
    Redis与Memcached的区别
    java优化占用内存的方法(一)
    Java内存区域与内存溢出异常(二)
    深入理解java垃圾回收机制
    从JAVA多线程理解到集群分布式和网络设计的浅析
    大型网站系统架构系列:分布式消息队列(一)
    大型网站系统架构系列:分布式消息队列(二)
    大型分布式网站架构技术总结
    40个Java多线程问题总结
  • 原文地址:https://www.cnblogs.com/LQBlog/p/12739369.html
Copyright © 2011-2022 走看看