java 23种设计模式之行为型模式—备忘录模式(19)
备忘录模式,即快照模式
基本定义:在不破坏封装性的前提下,获得一个对象的内部状态,并在该对象之外额外的保存这个状态。这样就可以将该对象恢复到之前的状态
备忘录模式有三种状态
- 发起人:记录当前状态,创建和恢复备份
- 备忘录:把发起人的一些状态进行保存
- 管理角色:对备忘录进行管理,可以进行多备份。
在windows下,我们常常用到Ctrl+z 来撤销动作,比如我们在输入文本的时候
我们这里就模拟windows下的Ctrl+z 撤销,我们这里模拟只能撤销最近的三条动作记录
首先创建我们的发起人类:
*
* 现在我们模拟恢复一段文字的操作
* 模拟只能恢复最近3条记录
*/
public class Originator {
private List<String> list = new ArrayList<String>();
public String getStr() {
return (this.list.size()==0 || this.list == null)? "没有数据了":(String) list.get(list.size()-1);
}
public void setStr(String str) {
if(this.list.size()<3){
this.list.add(str);
}else{
list.remove(0);
list.add(str);
}
}
public void setStr(List list) {
this.list = list;
}
//设置备忘
public Memento createMemento(){
return new Memento(this.list);
}
//恢复备份
public void restoreMemento(Memento memento){
this.setStr(memento.getStr());
}
}
list里面保存了我们最近操作的记录
setStr(String str)方法表示新增数据时的操作,需要检查当前的数据是否溢出,如果是,就删除第一条记录,在进行add操作
setStr(List list) 主要用于恢复备份用
备忘录类
public class Memento {
private List list;
public List getStr() {
list.remove(list.size()-1);
return list;
}
public void setStr(List list) {
this.list = list;
}
//构造方法用于获得需要备份的数据
public Memento(List list){
this.list = list;
}
}
既然是备忘录,那这里面要前一条数据,那就是方法getStr()中定义的移除最后一个list即可
管理角色
public class Caretaker {
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
管理角色,即管理备忘录,这里可以进行多备份,您只需要将 Memento定义为一个数组即可
下面是我们的测试类
public class Client {
public static void main(String[] args) {
// 初始状态
Originator originator = new Originator();
originator.setStr("状态0000");
originator.setStr("状态1111");
originator.setStr("状态2222");
originator.setStr("状态3333");
originator.setStr("状态4444");
Caretaker caretaker = new Caretaker();
//设置备份并将备份放进管理
caretaker.setMemento(originator.createMemento());
System.out.println("当前状态:"+originator.getStr());
//改变状态
originator.setStr("状态5555");
System.out.println("此时状态:"+originator.getStr());
//恢复状态
originator.restoreMemento(caretaker.getMemento());
System.out.println("恢复后的状态:"+originator.getStr());
originator.restoreMemento(caretaker.getMemento());
System.out.println("恢复后的状态1:"+originator.getStr());
originator.restoreMemento(caretaker.getMemento());
System.out.println("恢复后的状态2:"+originator.getStr());
}
}
打印结果如下:
当前状态:状态4444
此时状态:状态5555
恢复后的状态:状态4444
恢复后的状态1:状态3333
恢复后的状态2:没有数据了
最后的此时状态,恢复后的状态1,恢复后的状态2 这三条记录被正确的打印出来了
说明list的大小是3,因此最后一条打印信息显示 没有数据了
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情