备忘录模式
1. 介绍
备忘录模式(Memento Pattern)
是一种行为型模式。将对象的状态保存在它的备忘录对象中,以后就可以使用备忘录对象来将对象恢复到之前的状态中。
简单理解:现在有一个订单,将这个订单的信息保存到备忘录中,相当于将这个订单复制了一份。以后,我们就可以使用备忘录将这个订单的状态恢复到之前的状态。
优点
- 使得状态信息可以恢复。由于备忘录的存在,使得状态的恢复变得非常简单。
- 实现了信息的封装。我们只需要使用恢复状态的接口就可以实现状态的恢复,而无需关注实现的细节。
缺点
- 占用内存会增大。由于需要使用备忘录来复制状态信息,如果状态信息很多很大,这势必会增大占用的内存空间。
- 为了遵循迪米特法则,通常会增加一个管理备忘录的类。
2. 例子
有订单、备忘录、管理者这三个类,备忘录可以用来存储订单的状态信息,而管理者管理备忘录。
类图:
Order类
package mementoPattern;
/**
* 订单
*
* @author jxd
* @since 2021-06-13
*/
public class Order {
private String state;
public Order(String state) {
this.state = state;
}
public void SetState(String state) {
this.state = state;
}
public String getState() {
return state;
}
/**
* 创建订单的备忘录
* @return 订单的备忘录
*/
public Memento createMemento() {
return new Memento(state);
}
}
Memento类
备忘录,可以存储订单中的状态信息。
package mementoPattern;
/**
* 备忘录
*
* @author jxd
* @since 2021-06-13
*/
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;
}
}
Caretaker类
管理者,用来管理备忘录。
package mementoPattern;
/**
* 看管者
*
* @author jxd
* @since 2021-06-13
*/
public class Caretaker {
private Memento memento;
public Caretaker(Memento memento) {
this.memento = memento;
}
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
/**
* 从备忘录中恢复订单的状态
* @param order 要恢复的订单
* @return 状态恢复后的订单
*/
Order coverOrderState(Order order) {
order.SetState(memento.getState());
return order;
}
}
测试类:
package mementoPattern;
import org.junit.Test;
/**
* 备忘录模式的测试类
*
* @author jxd
* @since 2021-06-13
*/
public class TestJ {
@Test
public void test1() {
Order order = new Order("已支付");
System.out.println("订单的初始状态是:" + order.getState());
Memento memento = order.createMemento();
Caretaker caretaker = new Caretaker(memento);
order.SetState("未支付");
System.out.println("订单现在的状态是:" + order.getState());
order = caretaker.coverOrderState(order);
System.out.println("从备忘录中恢复后的订单状态为:" + order.getState());
}
}
运行结果:
订单的初始状态是:已支付
订单现在的状态是:未支付
从备忘录中恢复后的订单状态为:已支付
3. 总结
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。