设计模式笔记之备忘录模式的使用

<其它设计模式介绍及案例源码下载 >

简介:备忘录模式(Memento Pattern)保存一个对象的某个状态。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

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

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

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

使用场景: 1、需要保存/恢复数据的相关状态场景。 2、提供一个可回滚的操作。

注意: 通过一个备忘录类专门存储对象状态,为了符合迪米特原则,还要增加一个管理备忘录的类。被备份类(OptClass)不与备忘录类(CareTaker)耦合,与备忘录管理类(Originator)耦合。它包含以下几类角色:

Memento:备忘数据的bean;

Originator:发起者,需要备份数据的对象,其备份内容与Memento相同,负责创建备份数据,并能通过备份数据回写状态;

Caretaker:保存该备份数据的独享,类似第三方存储;

例如下:

public class OptClass {

	private String name;
	private String gender;
	//...还有很多其他属性
	public OptClass(String name, String gender) {
		super();
		this.name = name;
		this.gender = gender;
	}
	public String getName() {
		return name;
	}
	public String getGender() {
		return gender;
	}
	
}
public class Originator {

	private String name;
	private String gender;
	//...还有很多其他属性,属性内容与备份对象类的属性是一样的
	public Originator(String name, String gender) {
		super();
		this.name = name;
		this.gender = gender;
	}
	public String getName() {
		return name;
	}

	public String getGender() {
		return gender;
	}

	//用于创建备份
	public OptClass createMemento(){
        return new OptClass(this.name,this.gender);
    }
    //用于将备忘属性状态回写
    public void getStatesFromMemento(final OptClass oc){
        this.name = oc.getName();
        this.gender = oc.getGender();
    }
	@Override
	public String toString() {
		return "Originator [name=" + name + ", gender=" + gender + "]";
	}
  
}
public class CareTaker {

	private List<OptClass> list =new ArrayList<OptClass> ();
	
	public void addMemo(OptClass oc) {
		list.add(oc);
	}
	
	public OptClass getMemo(int index) {
		return list.get(index);
	}
}
public class TestClass {

	public static void main(String[] args) {
		//注意被备份类(OptClass)不与备忘录类(CareTaker)耦合,与备忘录管理类(Originator)耦合
		OptClass oc=new OptClass("张三","男");//被备份对象1
		OptClass oc2=new OptClass("小刘","女");//被备份对象2
		Originator originator = new Originator(oc.getName(),oc.getGender());//备忘录管理类对象
		Originator originator2 = new Originator(oc2.getName(),oc2.getGender());//备忘录管理类对象
		CareTaker careTaker = new CareTaker();//备忘录类对象
		careTaker.addMemo(originator.createMemento());//将备份信息存储
		careTaker.addMemo(originator2.createMemento());//将备份信息存储
		
		originator.getStatesFromMemento(careTaker.getMemo(0));//获取指定备份数据
		System.out.println("First saved State: " + originator);//读取备份数据
		originator.getStatesFromMemento(careTaker.getMemo(1));//获取指定备份数据
		System.out.println("Second saved State: " + originator);//读取备份数据

	}

}

猜你喜欢

转载自blog.csdn.net/fsy9595887/article/details/84308995