1.定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象复原到原先保存的状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6WkfVcK-1622785745870)(image-20210604105014409.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bU2YTVUX-1622785745872)(image-20210604105107322.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WV1ykGT-1622785745874)(image-20210604105146774.png)]
2.应用场合
-
适用于功能比较复杂的,但需要维护或记录属性历史的类。或者需要保存的属性只是众多属性中的一小部分时,可以通过备忘录信息还原到前一状态。
-
如果在某个系统中使用命令模式时,需要实现命令的撤销功能,那么命令模式可以使用备忘录模式来存储可撤销操作的状态。
-
当角色状态改变时,如果这个状态无效,就可以使用暂时存储起来的备忘录将状态复原。
缺点:
角色状态需要完整存储到备忘录对象中,如果状态数据很大很多,那么在资源消耗上,备忘录对象会非常耗内存。
3.代码示例
需要建备忘的类
package designmode.memento;
//需要备份状态的类
public class Originator {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
//为需要备份的状态创建备忘
public Memento CreateMemento(){
return new Memento(state);
}
//恢复到原来备忘的状态
public void SetMemento(Memento memento){
this.state=memento.getState();
}
//展示当前状态
public void ShowState(){
System.out.println("当前状态:"+state);
}
public void Operate(){
System.out.println("...干一系列事情");
}
}
//管理者
package designmode.memento;
public class Caretaker {
//管理者
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
//备忘录类
package designmode.memento;
public class Memento {
private String state;
public Memento(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
客户端
package designmode.memento;
public class Client {
public static void main(String[] args) {
Originator originator=new Originator();
originator.setState("第一个状态");
originator.ShowState();
//保存状态
Caretaker caretaker=new Caretaker();
caretaker.setMemento(originator.CreateMemento());
originator.Operate();
originator.setState("第二个状态");
originator.ShowState();
//恢复状态
originator.SetMemento(caretaker.getMemento());
originator.ShowState();
}
}
测试结果
当前状态:第一个状态
...干一系列事情
当前状态:第二个状态
当前状态:第一个状态