设计模式(第二十式:备忘录模式)

概念:
  备忘录模式:Without violating encapsulation, capture and externalize an object's internal state so that the object can be restored to this state later. 在不破坏封装性的前提下,捕获一个对象内部的状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。

实现:
  需要备份的对象

    public class Document {

        public Document(String name, String content) {
            this.name = name;
            this.content = content;
        }

        private String name;//文件名称一般不需要备份
        private String content;//文件内容一般需要备份

        public Backup backup() {
            System.out.println("文件被保存备份");
            return new Backup(this);
        }

        public void recover(Backup backup) {
            System.out.println("文件被还原");
            this.content = backup.getContent();
        }


        /*
        为了测试,这里重写toString方法
         */
        @Override
        public String toString() {
            return "Document{" +
                    "name='" + name + '\'' +
                    ", content='" + content + '\'' +
                    '}';
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

    }


  备份对象

    public class Backup {
        public Backup(Document document) {
            this.content = document.getContent();
        }

        private String content;
        private Integer versionNo;

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }

        public Integer getVersionNo() {
            return versionNo;
        }

        public void setVersionNo(Integer versionNo) {
            this.versionNo = versionNo;
        }
    }


  备份管理

    public class VersionControl {
        List<Backup> list = new ArrayList<>();

        Integer versionNo = 0;

        public void addBackup(Backup backup){
            backup.setVersionNo(versionNo++);
            list.add(backup);
        }

        public Backup get(Integer versoin){
            for(Backup backup : list){
                if(backup.getVersionNo().equals(versoin)){
                    return backup;
                }
            }
            return null;
        }
    }

 

测试及结果:

    @Test
    public void mementoTest(){
        Document document = new Document("测试文档","没有备份前的内容");
        VersionControl versionControl = new VersionControl();
        versionControl.addBackup(document.backup());

        System.out.println(document);

        document.setContent("第一次修改,并且要保存。");
        versionControl.addBackup(document.backup());

        System.out.println(document);

        document.recover(versionControl.get(0));

        System.out.println(document);
    }

 

  文件被保存备份
  Document{name='测试文档', content='没有备份前的内容'}
  文件被保存备份
  Document{name='测试文档', content='第一次修改,并且要保存。'}
  文件被还原
  Document{name='测试文档', content='没有备份前的内容'}

分析:
  1.备忘录模式的备份是将数据备份在缓存中,所以不建议大量的是备份对象。
  2.同时需要注意备份管理的生命周期,如果在使用中,应避免因线程或者别的某些机制导致引用失效。如果不使用应尽早删除引用,等待垃圾回收器回收对象,节省资源。

posted @ 2019-07-04 18:03  Mario0315  阅读(147)  评论(0编辑  收藏  举报