这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战java
欢迎来到今天的学习,今天咱们一块儿来学习下不怎么经常使用的一种模式-----备忘录模式。多唠叨几句,我本月将会对java的设计模式精讲,欢迎点击头像,关注个人专栏,我会持续更新,加油!程序员
系列文章:数据库
设计模式之单例模式设计模式
设计模式之工厂模式markdown
设计模式之建造者模式post
设计模式之代理模式单元测试
设计模式之命令者模式this
...持续更新中
话很少说,进入正题
相比较其余几种模式而言,备忘录模式不怎么经常使用。该模式我认为用起来你感受简单,理解起来也没有那么抽象,因此本节应该是比较简单的一节。
官方定义是:捕获并外部化对象的内部状态,以便之后能够恢复。
能够理解成copy,复制出一套东西,咱们程序员最经常使用的可能就是数据库的备份等。这个备忘录虽然表面字眼称之为备忘录,可是更多的就是理解为“备份模式”。
咱们看下简单的类图
从该图中,咱们能看出备忘录模式包含两个关键角色。
原始对象(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); //这时会显示原始的内容
}
}
复制代码
你们从代码中能够看出:备忘录模式在频繁须要撤销与恢复的场景中可以发挥很好的做用
备忘录模式也叫快照模式,具体来讲,就是经过捕获对象在某一个时刻的对象状态,再将其保存到外部对象,以便在须要的时候恢复对象到指定时刻下的状态。
注意:在使用备忘录模式时,必定不要误认为它就是万能的备份模式,要合理评估对象所使用的内存空间,再肯定是否使用备忘录模式。
好了 今天的讲述就到这里,备忘录模式比较简单,就很少赘述。
感谢你的阅读,若是你感受学到了东西,麻烦您点赞,关注。
我已经将本章收录在专题里,点击下方专题,关注专栏,我会天天发表干货,本月我会持续输入设计模式。
加油! 咱们下期再见!