Java设计模式-备忘录模式

最近学习到设计模式,现总结个人学习备忘录模式内容【注重的是在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态】。
上一篇:Java设计模式-中介者模式

定义

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。

优缺点

优点

  • 给用户提供了一种可以恢复状态的机制,可以使用户能够比较方便地回到某个历史的状态。
  • 实现了信息的封装,使得用户不需要关心状态的保存细节。

缺点

  • 消耗资源。如果类的成员变量过多,势必会占用比较大的资源,而且每一次保存都会消耗一定的内存。

实现

Java设计模式-备忘录模式_第1张图片

备忘录模式角色

  • Originator【这里的InitiatingMemo可以理解为】:负责创建一个备忘录,可以记录、恢复自身的内部状态。同时Originator还可以根据需要决定Memento存储自身的那些内部状态。
  • Memento【这里的Memento可以理解为笔记本上的内容】:备忘录角色,用于存储Originator的内部状态,并且可以防止Originator以外的对象访问Memento。
  • Caretaker【这里的NoteTaker,可以理解为记录本】:负责存储备忘录,不能对备忘录的内容进行操作和访问,只能够将备忘录传递给其他对象。

代码

/**例如我们常见的代码编辑器,有时候需要ctrl+z进行恢复
 * 需要备忘的数据
 * @author cc百川
 */
public class Memento {
	public String code;
	public Memento(String code) {this.code = code;}
}
/** 备忘记录,例如vscode需要插件进行记录
 * @author cc百川
 */
class NoteTaker{
	private List<Memento> mLit = new ArrayList<>();
	/** 添加需要备忘的数据
	 * @param mo
	 */
	public void add(Memento mo){
		mLit.add(mo);
	}
	/** 获取备忘的数据
	 * @param index
	 * @return
	 */
	public Memento getMemento(int index){
		return mLit.get(index);
	}
}
/**
 * 启动备忘 隔离备忘录
 * @author cc百川
 */
class InitiatingMemo {
	public String code;
	public InitiatingMemo(String code) { this.code = code;}
	//保存代码
	public Memento saveCode(){
		return new Memento(code);
	}
	//通过备忘录对象,恢复状态
	public void getCodeFromMemento(Memento memento) {
		code = memento.code;
	}
}

测试

/**例如我们常见的代码编辑器,有时候需要ctrl+z进行恢复
 * 需要备忘的数据
 * @author cc百川
 */
public class Memento {
	public String code;
	public Memento(String code) {this.code = code;}
}
/** 备忘记录,例如vscode需要插件进行记录
 * @author cc百川
 */
class NoteTaker{
	private List<Memento> mLit = new ArrayList<>();
	/** 添加需要备忘的数据
	 * @param mo
	 */
	public void add(Memento mo){
		mLit.add(mo);
	}
	/** 获取备忘的数据
	 * @param index
	 * @return
	 */
	public Memento getMemento(int index){
		return mLit.get(index);
	}
}
/**
 * 启动备忘 隔离备忘录
 * @author cc百川
 */
class InitiatingMemo {
	public String code;
	public InitiatingMemo(String code) { this.code = code;}
	//保存代码
	public Memento saveCode(){
		return new Memento(code);
	}
	//通过备忘录对象,恢复状态
	public void getCodeFromMemento(Memento memento) {
		code = memento.code;
	}
}

Java设计模式-备忘录模式_第2张图片


备忘录模式,重点在于,在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,可以理解为在笔记本上记录数据,每一页记录的数据可以是不一样的对象的内容。
以上仅为个人学习,如果错误望指出,谢谢。

你可能感兴趣的:(#,Java设计模式)