备忘录模式,是怎么记住状态的,你知道吗?
在什么情况下,我们可以使用备忘录模式?

备忘录模式(Memento Pattern),在不破坏一个对象的前提下,捕获对象的内部状态,并保持在对象外部,以便在需要的时候,恢复该对象状态。它是一种行为型模式。
业务场景:需要保持、恢复数据的相关状态场景。
优点:给用户提供一个恢复状态的机制;缺点:恢复的状态越多,浪费的内存越多。
关键代码:发起人、备忘录类,备忘录管理类。
下面看UML类图:

UML类图说明:Memento是备忘录,负责存储Originator的内部状态。MementoManager是备忘录的管理类,它聚合了Memento备忘录。Originator是发起人,它依赖Memento备忘录类。
三个对象,两种关系。发起人与备忘录类是依赖关系,发起人依赖备忘录类,备忘录类存储它的内部状态。备忘录类与备忘录管理类之间是聚合关系,备忘录管理类聚合了备忘录类。备忘的状态最终交给备忘录管理类保存。
下面看代码实现步骤:
1.备忘录类,负责存储发起人的内部状态;
/**
* 1. 备忘录类
* @author 程就人生
* @Date
*/
public class Memento {
// 需要保存的状态
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
}
2.备忘录管理类,负责管理备忘录类;
import java.util.ArrayList;
import java.util.List;
/**
* 2.备忘录管理者
* @author 程就人生
* @Date
*/
public class MementoManager {
private List<Memento> mementoList = new ArrayList<Memento>();
// 添加备忘录
public void addMemento(Memento memento){
mementoList.add(memento);
}
// 获取某一次存储的状态
public Memento getMemento(int index){
return mementoList.get(index);
}
}
3.发起人,负责保存当前的状态;
public static void main(String[] argo){
// 备忘状态的对象
Originator originator = new Originator();
// 备忘录管理者
MementoManager mementoManager = new MementoManager();
// 第一次设置的状态
originator.setState("state #1");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #2");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #3");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #4");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #5");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
System.out.println("当前的状态:" + originator.getState());
// 从备忘录中获取所存储的状态
originator.getStateToMemento(mementoManager.getMemento(1));
System.out.println("恢复到第二次的状态:" + originator.getState());
}
4.测试代码;
public static void main(String[] argo){
// 备忘状态的对象
Originator originator = new Originator();
// 备忘录管理者
MementoManager mementoManager = new MementoManager();
// 第一次设置的状态
originator.setState("state #1");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #2");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #3");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #4");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
// 第二次设置状态
originator.setState("state #5");
// 保存状态到备忘录中
mementoManager.addMemento(originator.saveStateToMemento());
System.out.println("当前的状态:" + originator.getState());
// 从备忘录中获取所存储的状态
originator.getStateToMemento(mementoManager.getMemento(1));
System.out.println("恢复到第二次的状态:" + originator.getState());
}
运行结果:
当前的状态:state #5
恢复到第二次的状态:state #2
这段代码的意思是:发起人更改过很多次状态,每次更改状态时,进行了备忘,并交给备忘录管理类进行管理。如果想恢复某次的状态,则通过备忘录管理类通过索引获取即可。以上便是备忘录模式的简单实现。
最后总结
备忘录模式,强调历史状态的保持与恢复。最主要的类是状态管理的备忘录类和备忘录管理者。
思考题:在日常工作中,你都遇到了哪些备忘录的使用场景?
网友评论