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/天,具体规则查看活动详情