一、基本介绍
备忘录模式(行为型):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。
二、包含角色
1.发起人角色:记录当前时刻的内部状态信息,提供创建备忘录和恢复备忘录数据的功能,实现其他业务功能,它可以访问备忘录里的所有信息。
2.备忘录角色:负责存储发起人的内部状态,在需要的时候提供这些内部状态给发起人。
3.对备忘录进行管理,提供保存与获取备忘录的功能,但其不能对备忘录的内容进行访问与修改。
三、案例及UML类图
案例说明:
当我们进行word文档操作时,总习惯性的按ctrl+s进行保存操作,当写错时就回滚到上一步或者更上一步即可。
UML类图:
类Word:
public class Word {
//word内容
private StringBuilder content = new StringBuilder();
/**
* 保存当前步骤
* @return 备忘录
*/
public Memento saveContent() {
return new Memento(content.toString());
}
/**
* 回滚
* @param memento 回滚的内容
*/
public void rollBack(Memento memento) {
this.content = new StringBuilder();
this.content.append(memento.getContent()).append("\n");
}
public void write(String content) {
this.content.append(content);
}
public String show() {
return content.toString();
}
}
说明:文档类,发起人角色,提供了对当前文档的保存功能和回滚功能和写入功能。
类Memento:
public class Memento {
//文档内容
private String content;
public Memento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
说明:备忘录类,备忘录角色,保存word文档某一个时刻的内容。
类MementoManage:
public class MementoManage {
private LinkedList<Memento> mementoList = new LinkedList<>();
/**
* 添加一个备忘录即保存内容
* @param memento 备忘录
*/
public void addMemento(Memento memento) {
mementoList.add(memento);
}
/**
* 获取上一步保存的内容
* @return 备忘录
*/
public Memento previousStep() {
return mementoList.removeLast();
}
}
说明:备忘录管理类,管理者角色,对备忘录进行保存和获取,不能对备忘录进行修改。
类MementoTest:
public class MementoTest {
public static void main(String[] args) {
//备忘录管理
MementoManage mementoManage = new MementoManage();
//创建一个文档准备写内容
Word word = new Word();
word.write("hello word!");
//保存内容
Memento memento = word.saveContent();
mementoManage.addMemento(memento);
word.write("jaav");
//继续写内容
word.write("我要学java");
//发现之前的java打错了,返回上一步
//获取上一步保存的内容
Memento previousStep = mementoManage.previousStep();
//word进行回滚
word.rollBack(previousStep);
//输出回滚后的内容
System.out.println(word.show());
}
}
说明:测试及客户端。
四、适用场景
1.需要保存/恢复数据的相关状态场景
2.提供一个可回滚的操作。