一、备忘录模式
1、备忘录模式
备忘录模式(Memento Pattern)是一种行为型模式。通过保存一个对象的某个状态,以便在适当的时候恢复对象。
2、实现思路
(1)、定义记录数据的格式规范。
(2)、编写实现类,实现备忘实体对象。
(3)、定义操作对象类,内置数据和备忘录集合,记录当前对象的数据,同时添加到备忘录中。
二、代码场景
1、示例场景
用户可以多次操作一个数据,每次操作后的结果会改变。通过备忘录回溯之前的操作数据。
2、代码示例
// 1、定义数据格式
public interface Memento1 {
String getData();
void setData(String data);
}
// 2、定义实现类,即备忘录对象
public class MementoBook implements Memento1 {
String data; // 备忘录记录data数据
public MementoBook(String data) {
this.data = data;
}
@Override
public String getData() {
return data;
}
@Override
public void setData(String data) {
this.data = data;
}
}
// 3、定义操作对象,记录数据,记录备忘录,封装回溯方法
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class Originator {
String data; // 操作数据
List<MementoBook> mementoBooks; // 备忘录集合
public Originator() {
mementoBooks = new ArrayList<>();
}
public void saveData(String data) { // 保存操作数据
this.data = data;
mementoBooks.add(new MementoBook(data));
}
public void revoke() { // 返回上一次操作的数据
this.data = mementoBooks.get(mementoBooks.size() - 2).getData();
mementoBooks = mementoBooks.subList(0, mementoBooks.size() - 1);
}
public void revokeHistory(int index) { // 返回到历史指定的数据
this.data = mementoBooks.get(index - 1).getData();
mementoBooks = mementoBooks.subList(0, index);
}
}
// 4、测试
public static void main(String[] args) {
Originator originator = new Originator();
originator.saveData("1");
originator.saveData("2");
originator.saveData("3");
originator.saveData("4");
originator.saveData("5");
originator.saveData("6");
originator.saveData("7");
originator.saveData("8");
originator.saveData("9");
originator.saveData("10");
System.out.println("当前值:"+originator.getData());
originator.revoke();
System.out.println("撤回一步的值:"+originator.getData());
originator.revoke();
System.out.println("撤回一步的值:"+originator.getData());
originator.revokeHistory(5);
System.out.println("测绘到第5步当时的值:"+originator.getData());
}
操作结果:
总结:备忘录,顾名思义就是怕忘记而做的笔记。主要用来做数据的回溯,方便查询过去时刻的数据。本例实现主要通过定义的一个集合,这个集合仅包含一个对象的操作接口,所以需要内置到对象的属性中。真实开发是,数据可以是任意类型的对象,保存也可以是数据库等第三方组件,但是一定要有一个原则,就是一个操作类仅能有自己的操作数据即可。
学海无涯苦作舟!!!