<其它设计模式介绍及案例源码下载 >
简介:备忘录模式(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);//读取备份数据
}
}