Java中的备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后可以将对象恢复到原先保存的状态。
主要角色包括:
优点:
缺点:
常见应用场景:
java实现控制台输入内容的回退

实现步骤:
ScannerInput.java
// 发起者
public class ScannerInput {
// 输入内容
protected String input;
public ScannerInput(String input) {
this.input = input;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
}
Originator.java
// 备忘录
// 继承发起者,主要继承发起者的属性及get/set方法不再重复提供
// 提供创建备忘录及通过备忘录恢复状态的方法
public class Originator extends ScannerInput{
public Originator(String input) {
super(input);
}
// 创建备忘录
public ScannerInput createMemento() {
return new ScannerInput(this.input);
}
// 恢复
public void restoreMemento(ScannerInput scannerInput) {
this.input = scannerInput.getInput();
}
}
Caretaker.java
import java.util.Stack;
// 看护者
// * 对备忘录进行管理,提供保存与获取备忘录的功能。但它不能对备忘录的内容进行访问与修改。
public class Caretaker {
// 定义栈管理备忘录
private Stack<ScannerInput> stack = new Stack<ScannerInput>();
// 压栈
public void setScannerInput(ScannerInput scannerInput) {
stack.push(scannerInput);
}
// 出栈
public ScannerInput getScannerInput() {
if(stack.size() == 0){
System.out.println("已经不可以回退啦!");
}
return stack.pop();
}
}
TestClient.java
import java.util.Scanner;
public class TestClient {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一些文本,输入'exit'退出:");
// 创建原发器对象并设置默认内容
Originator originator = new Originator("");
// 创建并保存备忘录
Caretaker caretaker = new Caretaker();
// 初始化压栈
caretaker.setScannerInput(originator.createMemento());
while (true) {
String input = scanner.nextLine();
if ("exit".equalsIgnoreCase(input)) {
System.out.printf("你输入了:%s%n" , input);
break;
}
// 回退操作
else if ("back".equalsIgnoreCase(input)) {
// 回退
originator.restoreMemento(caretaker.getScannerInput());
System.out.printf("回退上一步-你输入:%s%n 输入:back(回退上一步) exit(退出)%n" , originator.getInput());
} else {
// 设置内容
originator.setInput(input);
// 设置备忘录
caretaker.setScannerInput(originator.createMemento());
System.out.printf("你输入了:%s%n 输入:back(回退上一步) exit(退出)%n" , originator.getInput());
}
}
scanner.close();
System.out.println("已退出。");
}
}
执行结果:
