电子说
模式描述
备忘录设计模式(Memento Design Pattern)是一种行为型设计模式,它的主要目的是在不破坏对象封装性的前提下,捕捉和保存一个对象的内部状态,以便稍后可以将对象恢复到该状态。这种模式通常用于实现撤销和重做操作。
主要角色
1、备忘录(Memorandum) :保存了发起人的状态,从而能够在适当的时候恢复状态。2. 发起人(Originator) :创建一个备忘录,以表示其当前状态,并可以从备忘录中恢复状态。
引用场景
1.后退/前进:浏览器的后退/前进就是缓存页面状态的典型例子。2.撤销/重做:通常基于备忘录模式实现撤销和重做操作。3.快照:保存某个时间点对象的状态快照。
设计要点
1.仅仅存储状态:备忘录仅存储对象的内部状态,而不是存储对象的引用。2.完全封装:外部不会访问到备忘录类。3.避免权限问题:发起人应该具有创建和访问备忘录的权限。
优缺点
•轻松实现对象状态的快照和恢复•分离了对象与状态的保存与恢复过程•需要额外的空间来存储状态
与备忘录模式类似的模式
•原型模式:对一个对象进行克隆,产生一个与原对象类似的新对象。
Java代码示例
首先,我们创建一个发起人(Originator)类,它具有保存和恢复状态的能力:
publicclassOriginator{
privateString state;
publicvoid setState(String state){
this.state = state;
}
publicString getState(){
return state;
}
publicMemento saveStateToMemento(){
returnnewMemento(state);
}
publicvoid getStateFromMemento(Memento memento){
state = memento.getState();
}
}
接下来,我们创建备忘录(Memento)类,用于保存发起人的状态:
publicclassMemento{
privateString state;
publicMemento(String state){
this.state = state;
}
publicString getState(){
return state;
}
}
现在,我们创建一个负责人(Caretaker)类,用于管理备忘录:
import java.util.ArrayList;
import java.util.List;
publicclassCaretaker{
privateList< Memento > mementoList =newArrayList< >();
publicvoid add(Memento state){
mementoList.add(state);
}
publicMementoget(int index){
return mementoList.get(index);
}
}
最后,我们在主类中使用这些类:
publicclassMementoPatternDemo{
publicstaticvoid main(String[] args){
Originator originator =newOriginator();
Caretaker caretaker =newCaretaker();
originator.setState("State #1");
originator.setState("State #2");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #3");
caretaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: "+ originator.getState());
originator.getStateFromMemento(caretaker.get(0));
System.out.println("First saved State: "+ originator.getState());
originator.getStateFromMemento(caretaker.get(1));
System.out.println("Second saved State: "+ originator.getState());
}
}
扩展知识点
备忘录模式与命令模式(Command Pattern)可以结合使用,以实现更加强大的撤销/重做功能。命令模式可以用来记录操作的顺序和执行操作,而备忘录模式用来记录操作前后的状态。这样一来,我们可以轻松地在操作序列中向前或向后移动,同时还可以保留每个操作的上下文信息。
全部0条评论
快来发表一下你的评论吧 !