设计模式-行为型模式-备忘录模式 Memento
1.简介
封装对象是面向对象的基本原则之一,当对象添加功能,或者修改属性,并且需要保存当时的内部状态(可以理解为快照),可能后面会需要恢复;
保存内部状态而不破坏其封装,并在以后阶段恢复其状态;
2.角色
- Originator: 发起者 发起者是需要记住状态的对象,
- Memento: 备忘录 负责存储发起者变化,用来恢复到先前状态的类 ;(可以理解成为 保存序列化后的对象)
- Caretaker:管理者 负责触发存储发起者变化,或者触发恢复到先前状态的类 (Client ) (可以理解成触发序列化或者反序列化)
3.场景
需要执行回滚操作,就会使用备忘录模式,比如原子事务,其中一个失败,就恢复到原来的状态;
4.写个例子
根据角色来写吧,场景就是比如一个对象有较多的属性,然后一顿修改后,需要把属性恢复到原来的状态
**发起者 **需要记住状态的对象
class CarOriginator {
public String state1 = "1";
public String state2 = "2";
public String state3 = "3";
public String staten = "n";
public Memento saveMemento() {
return new Memento(state1 + "," + state2 + "," + state3 + "," + staten);
}
public void restoreMemento(Memento m) {
String[] split = m.state1_n.split(",");
state1 = split[0];
state2 = split[1];
state3 = split[2];
staten = split[3];
}
@Override
public String toString() {
return "CarOriginator{" + "state1='" + state1 + '\'' + ", state2='" + state2 + '\'' + ", state3='" + state3
+ '\'' + ", staten='" + staten + '\'' + '}';
}
}
备忘录 :存储状态
class Memento {
public String state1_n;
public Memento(String state1_n) {
this.state1_n = state1_n;
}
}
管理者 : 这里可以理解成main方法 触发的动作
public static void main(String[] args) throws CloneNotSupportedException {
CarOriginator carOriginator = new CarOriginator();
System.out.println("最开始" + carOriginator);
Memento memento = carOriginator.saveMemento();
carOriginator.state1 = "乱七八糟";
carOriginator.staten = "乱七八糟";
carOriginator.state2 = "乱七八糟";
System.out.println("修改后 " + carOriginator);
// 恢复
carOriginator.restoreMemento(memento);
System.out.println("还原状态" + carOriginator);
}
执行效果
最开始CarOriginator{state1='1', state2='2', state3='3', staten='n'}
修改后 CarOriginator{state1='乱七八糟', state2='乱七八糟', state3='3', staten='乱七八糟'}
还原状态CarOriginator{state1='1', state2='2', state3='3', staten='n'}