【设计模式】行为型07备忘录模式(Memento Pattern)

参考地址:http://www.runoob.com/design-pattern/memento-pattern.html
对原文总结调整,以及修改代码以更清晰的展示:

备忘录模式(快照模式):

        定义:顾名思义,备忘录模式是在不破坏封装性的前提下,通过备忘录对象,记录一个对象的内部状态,并在该对象之外保存这个状态。


        应用场景 2、打游戏时的存档。 3、Windows 里的 ctri + z。 4、IE 中的后退。 4、数据库的事务管理。


图:日后再画

代码:

1、状态记录类:

package com.pat.snap;
/**
 * 备忘录对象,用于记录
 * @author Administrator
 *
 */
public class Memento {
	private String text="";

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}
	
}

2、编辑器-被记录类

package com.pat.snap;
/**
 * 记事本对象,被记录的对象
 * @author Administrator
 *
 */
public class TextEditor {
	//正在编辑的内容
	private String text="";

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = this.text+text;
	}
	//保存
	public Memento saveHistory() {
		Memento curr = new Memento();
		curr.setText(this.text);
		return curr;
	}
	//ctrl+z
	public void backUp(Memento mem) {
		this.text=mem.getText();
	}
	
}

3、存储记录

package com.pat.snap;

import java.util.ArrayList;
import java.util.List;

/**
 * 管理历史,负责恢复
 * @author Administrator
 *
 */
public class CareTaker {
	private List<Memento> mementoList = new ArrayList<Memento>();

	   public void add(Memento state){
	      mementoList.add(state);
	   }

	   public Memento get(int index){
	      return mementoList.get(index);
	   }

}

4、测试类

package com.pat.snap;
/**
 * 测试类
 * @author ZX
 *
 */
public class Test {
	public static void main(String[] args) {
		//创建历史记录管理类
		CareTaker ct =new CareTaker();
		//记事本编辑文件
		TextEditor td = new TextEditor();
		td.setText("123");
		td.setText("456");
		//创建快照1
		Memento h1 = td.saveHistory();
		ct.add(h1);
		td.setText("789");
		td.setText("10");
		td.setText("11");
		
		//创建快照2
		Memento h2 = td.saveHistory();
		ct.add(h2);
		//获取快照1
		Memento memento1 = ct.get(0);
		System.out.println(memento1.getText());
		//获取快照2
		Memento memento2 = ct.get(1);
		System.out.println(memento2.getText());
		
		
	}
}

5、运行结果:

123456
1234567891011


原文地址:https://www.cnblogs.com/the-fool/p/11054146.html