携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情
简介
备忘录模式的定义:
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。
详细点说明是:在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将对象恢复到原先保存的状态。在我们生活中其实有很多类似的场景,比如我们的电脑有一个还原点的功能,可以将电脑还原到某个时间点;还有咱们程序员常用的版本管理工具git、svn都是类似的模式,创建一个备忘,需要的时候能够恢复到备忘这个状态。
很多文档中对于备忘录模式都提了3个角色
- Originator 原发器
- Memento 备忘录
- Caretaker 负责人
但是我角色这三个概念并不好理解,而且这几个单词很多人都不认识(也包括我),看起来很别扭,代码示例看起来也是怪怪的。故今天我们用另外一个案例来讲解说明备忘录模式。
案例
既然是备忘录,那我们就用记备忘的例子来说明最合适不过了。在记录备忘这个过程中我们同样定义3个参与者,第一个是一条笔记,对应上文的备忘录,然后是一个笔记本,备忘录肯定是写在笔记本上的,它相当于上文的负责人,最后一个是记录备忘录的人,即一个人张三,对应上文的原发器。
一条备忘录中记录下张三当前的状态:
public class Note {
private String state;
public Note(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
笔记本用于记录备忘,故有新增一条备忘和获取某一条历史备忘的方法:
public class NoteBook {
private List<Note> noteList = new ArrayList();
public void addNote(Note note) {
noteList.add(note);
}
public Note getNote(int index) {
return noteList.get(index);
}
}
张三自己有一个状态,还有一个将当前状态生成备忘的方法:
public class ZhangSan {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Note getNote() {
return new Note(state);
}
}
在测试类中我们看到,张三当前的状态虽然已被设置为play了,但是我们仍然可以获取到他历史的状态。
public class App {
public static void main(String[] args) {
NoteBook noteBook = new NoteBook();
ZhangSan zhangSan = new ZhangSan();
zhangSan.setState("sleep");
noteBook.addNote(zhangSan.getNote());
zhangSan.setState("getup");
noteBook.addNote(zhangSan.getNote());
zhangSan.setState("play");
System.out.println(noteBook.getNote(0).getState());
System.out.println(noteBook.getNote(1).getState());
}
}
总结
虽然备忘录的本身的概念很容易理解,但是备忘录模式中的三个参与者由于引入了新的概念和命令所以一开始还是不好吃透的,所以设计模式这个东西还是得多熟悉,多练习运用,才能融会贯通。