设计模式(十八) 备忘录模式

版权声明:本文为博主原创文章,未经博主允许不得转载。转载请注明出处,并告知本人 https://blog.csdn.net/the_conquer_zzy/article/details/83579301

备忘录模式: 在不破坏封装性的前提下,捕获一个对象的内部状态, 并在该对象之外保存这个状态。这样以后可将该对象恢复到原先保存的状态

在这里插入图片描述

备忘录模式角色:

  • Originator 发起人角色
  • Memento 备忘录角色
  • Caretaker 备忘录管理员角色
public class Originator{
	private String state="";
	public String getState(){
		return state;
	}
   public void setState(String state){
		this.state=state;
	}
	//创建备忘录
	public Memento createMemento(){
		return new Memento(this.state);
	}
	//恢复备忘录
	public void restoreMemento(Memento memento){
		this.setState(memento.getState());
	}
}

public class Memento{
	private String state="";
public Memento(String state){
	this.state=state;
}

public String getState(){
	return state;
}

public void setState(String state){
	this.state=state;
}
}

public class Caretaker{
	private Memento memento;
	public Memento getMemento(){
		return memento;
}

public void setMemento(Memento memento){
	this.memento=memento;
}
}

public  class Client{
	public static void main(String [] args){
		Originator originator=new Originator();
		Caretaker caretaker=new Caretaker();
		caretaker.setMemento(originator.createMemento());
		originator.restoreMemento(caretaker.getMemento());
}
}

备忘录模式的应用场景

  • 需要提供一个可回滚的操作
  • 需要监控的副本场景中
  • 数据库连接的事务管理就是用的备忘录模式

备忘录模式的注意事项

  • 备忘录的生命周期 。要主动管理备忘录对象,不使用就要删除引用, 等待垃圾回收器对它的回收处理
  • 备忘录的性能 不要在循环中使用备忘录。1. 控制不了备忘录建立的对象数量 2. 大对象的建立要消耗资源

备忘录模式的扩展

  • 利用clone方式的备忘录,这个也会牵涉到浅拷贝的问题
  • 利用hashmap进行多状态,多版本的备忘录
  • 为了达到更好的封装。 可以采用内部类进行处理。 内部类全是private的访问权限。 可以增加一个接口,完成关联的效果。

要点:

考虑到对象的安全问题。一个类可以实现多个接口, 一个是业务的正常接口,叫宽接口。 另一个接口是空接口,目的是提供给子系统外的模块访问。比如容器对象,这个叫做窄接口。

猜你喜欢

转载自blog.csdn.net/the_conquer_zzy/article/details/83579301