备忘录模式(Memento)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
在GoF23种设计模式中,属于行为型模式( Behavioral Patterns)
。
备忘录模式提供了数据的备份功能,以便在数据异常时对数据进行恢复等补救措施。
- 优点
- 增强了备份对象功能,如版本控制,回滚等
- 不需要修改备份对象内容
- 缺点
- 浪费资源
- 使用场景
- 编辑器撤销功能
- 数据状态备份恢复查询
实例
角色说明
- Originator
- 原发器创建备忘录
- 使用备忘录恢复状态
- Memento
- 备忘录
- Caretaker
- 负责管理备忘录
- Client
- 使用者
举例
我们以写日记为例,假设日记写错了一句,使用备忘录模式进行回滚。
角色说明
- Diary(Originator)
- 日记
- DiaryMemento(Memento)
- 备忘录
- Caretaker(Caretaker)
- 备忘录管理器
- Client(Client)
- 写字台
code
- Diary.java
public class Diary {
private String article;
public String getArticle() {
return article;
}
public void setArticle(String article) {
this.article = article;
}
public DiaryMemento createMemento() {
return new DiaryMemento(article);
}
public void checkoutDiary(Caretaker caretaker) {
this.article = caretaker.getMemento().getArticle();
}
}
- DiaryMemento.java
public class DiaryMemento {
private String article;
public DiaryMemento(String article) {
this.article = article;
}
public String getArticle() {
return article;
}
}
- Caretaker.java
public class Caretaker {
private Stack<DiaryMemento> articleStack = new Stack<>();
public void addMemento(DiaryMemento diaryMemento) {
articleStack.add(diaryMemento);
}
public DiaryMemento getMemento() {
return articleStack.pop();
}
}
- Client.java
public class Client {
public static void main(String[] args) {
Diary diary = new Diary();
Caretaker caretaker = new Caretaker();
//写了个开头,并备忘
diary.setArticle("啊\n在苍茫的大海上啊\n");
caretaker.addMemento(diary.createMemento());
System.out.println("1. 日记内容如下:\n" + diary.getArticle());
//接着写
diary.setArticle("啊\n在苍茫的大海上啊\n有一只小小的飞燕");
System.out.println("2. 日记内容如下:\n" + diary.getArticle());
System.out.println("(内心:我擦嘞,写错误了,应该是海燕,赶紧撤销)");
//撤销
diary.checkoutDiary(caretaker);
System.out.println("\n3. 撤销后,日记内容如下:\n" + diary.getArticle());
//接着写,并备份
diary.setArticle("啊\n在苍茫的大海上啊\n有一只小小的海燕");
caretaker.addMemento(diary.createMemento());
System.out.println("4. 继续写日记内容如下:\n" + diary.getArticle());
}
}
- output
1. 日记内容如下:
啊
在苍茫的大海上啊
2. 日记内容如下:
啊
在苍茫的大海上啊
有一只小小的飞燕
(内心:我擦嘞,写错误了,应该是海燕,赶紧撤销)
3. 撤销后,日记内容如下:
啊
在苍茫的大海上啊
4. 继续写日记内容如下:
啊
在苍茫的大海上啊
有一只小小的海燕
实例
暂无(备忘录模式一般运用于实际业务开发中)
总结
通过备忘录模式,可以在不破坏原有对象封装的前提下,为原对象提供状态恢复查询等功能。但特殊情况下,备忘录模式需要消耗很大的资源。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: