java 23种设计模式之行为型模式—备忘录模式(19)

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