java备忘录模式 | 如何记录历史信息

519951628599605_.pic.jpg

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战java

欢迎来到今天的学习,今天咱们一块儿来学习下不怎么经常使用的一种模式-----备忘录模式。多唠叨几句,我本月将会对java的设计模式精讲,欢迎点击头像,关注个人专栏,我会持续更新,加油!程序员

系列文章:数据库

设计模式之单例模式设计模式

设计模式之工厂模式markdown

设计模式之建造者模式post

设计模式之代理模式单元测试

设计模式之访问者模式学习

设计模式之适配器模式测试

设计模式之命令者模式this

java状态模式 | 随时随地监控状态改变

java观察者模式 | 如何通知事物的变化

...持续更新中

话很少说,进入正题

备忘录模式

相比较其余几种模式而言,备忘录模式不怎么经常使用。该模式我认为用起来你感受简单,理解起来也没有那么抽象,因此本节应该是比较简单的一节。

官方定义是:捕获并外部化对象的内部状态,以便之后能够恢复。

能够理解成copy,复制出一套东西,咱们程序员最经常使用的可能就是数据库的备份等。这个备忘录虽然表面字眼称之为备忘录,可是更多的就是理解为“备份模式”。

咱们看下简单的类图

image.png

从该图中,咱们能看出备忘录模式包含两个关键角色。

  • 原始对象(Originator):除了建立自身所须要的属性和业务逻辑外,还经过提供方法 create() 和 restore(memento) 来保存和恢复对象副本。

  • 备忘录(Memento):用于保存原始对象的全部属性状态,以便在将来进行撤销操做(我的理解,就是备份容器对象,将要备份的东西放到这里)。

下面咱们首先来看看上图中 对应的代码实现。,而后再结合业务来实现。首先,咱们建立原始对象 Originator,对象中有四个属性,分别是 state 用于显示当前对象状态,name、用来模拟业务属性

public class Originator {
    private String state = "原始对象";  //打印当前状态
    private String name;
    public Originator() {
    }
    //省略get、set方法


    //备份(备忘录)
    public Memento create() {
        return new Memento(name);
    }
    
    //撤销返回
    public void restore(Memento m) {
        this.state = m.getState();
        this.name = m.getName();
    }
   
}
复制代码

而后,再来建立备忘录对象 Memento,你会发现备忘录对象几乎就和原始对象的属性如出一辙。

public class Memento {
    private String state = "从备份对象恢复为原始对象";  //打印当前状态
    private String name;
    public Memento(String name) {
        this.name = name;
    }
    //省略get、set方法
}
复制代码
public class Demo {
    public static void main(String[] args) {
        Originator originator = new Originator();
        originator.setName("张三");
        System.out.println(originator);
        Memento memento = originator.create();
        originator.setName("李四");
        System.out.println(originator);
        originator.restore(memento);
        System.out.println(originator);
    }
}
复制代码

下面咱们看下具体场景实现

场景及代码实现

好比咱们现正在写掘金文章。突然个人电脑死机了。直接重启了,那我这好不容易快写好的文章怎么办,难道还须要重头再写吗。固然不是

我能够先建立一个 Blog 对象,该对象中包含 掘金ID、title 和 content,分别表明了 Blog 的惟掘金惟一ID、标题和内容;并提供建立备忘录的 createMemento() 和 restore(BlogMemento m) 方法,分别用于建立备忘录和经过备忘录来恢复原始的 Blog 对象。

代码实现

//博客内容实体
public class Blog {
    private long id;
    private String title;
    private String content;
    public Blog(long id, String title) {
        super();
        this.id = id;
        this.title = title;
    }
    //get set 省略
    
    
    public BlogMemento createMemento() {
        BlogMemento m = new BlogMemento(id, title, content);
        return m;
    }
    public void restore(BlogMemento m) {
        this.id = m.getId();
        this.title = m.getTitle();
        this.content = m.getContent();
    }
    
}
复制代码

而后,再来建立一个 Blog 的备忘录对象 BlogMemento,一样是复制 Blog 所须要的全部属性内容。

public class BlogMemento {
    private final long id;
    private final String title;
    private final String content;
    public BlogMemento(long id, String title, String content) {
        super();
        this.id = id;
        this.title = title;
        this.content = content;
    }
    public long getId() {
        return id;
    }
    public String getTitle() {
        return title;
    }
    public String getContent() {
        return content;
    }
}
复制代码

这样基于 Blog 对象的备忘录就建立好了。最后,咱们依然仍是运行一段单元测试代码来看看运行结果。

public class Client {
    public static void main(String[] args) {
        Blog blog = new Blog(1, "java备忘录模式 | 如何记录历史信息");
        blog.setContent("历史信息的记录........");      //原始的文章内容
        System.out.println(blog);
        BlogMemento memento = blog.createMemento();   //建立blog的备忘录
        blog.setContent("修改图片");      //改变内容
        System.out.println(blog);
        blog.restore(memento);       //撤销操做
        System.out.println(blog);    //这时会显示原始的内容
    }
}
复制代码

你们从代码中能够看出:备忘录模式在频繁须要撤销与恢复的场景中可以发挥很好的做用

总结

备忘录模式也叫快照模式,具体来讲,就是经过捕获对象在某一个时刻的对象状态,再将其保存到外部对象,以便在须要的时候恢复对象到指定时刻下的状态。

注意:在使用备忘录模式时,必定不要误认为它就是万能的备份模式,要合理评估对象所使用的内存空间,再肯定是否使用备忘录模式。

好了 今天的讲述就到这里,备忘录模式比较简单,就很少赘述。

弦外之音

感谢你的阅读,若是你感受学到了东西,麻烦您点赞,关注。

我已经将本章收录在专题里,点击下方专题,关注专栏,我会天天发表干货,本月我会持续输入设计模式。

加油! 咱们下期再见!

相关文章
相关标签/搜索