一,备忘录模式
备忘录模式: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以方便后面恢复到原先状态;
二,原理类图
意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
适用性:
必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。
如果一个用接口来让其它对象直接得到这些状态,将会暴露对象的实现细节并破坏对象的封装性。
三,实例
Originator: 需要保存状态的对象
package com.neei.memento;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/16 22:40
* @Description: 游学网
* @throws:
*/
public class Originator {
private String status;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Memento saveStatusMemento() {
return new Memento(status);
}
public void getStatusFromMemento(Memento memento) {
status = memento.getStatus();
}
}
Memento(备忘录对象): 负责保存记录,即保存Originator内部状态的对象
package com.neei.memento;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/16 22:41
* @Description: 游学网
* @throws:
*/
public class Memento {
private String status;
public Memento(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
}
Caretaker(守护者对象): 负责保护多个备忘录对象,如备忘录集合等;
package com.neei.memento;
import java.util.ArrayList;
import java.util.List;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/16 22:44
* @Description: 游学网
* @throws:
*/
public class Caretaker {
private List<Memento> mementos = new ArrayList<>();
public void add(Memento memento) {
mementos.add(memento);
}
public Memento get(int index) {
return mementos.get(index);
}
}
调用
package com.neei.memento;
/**
* @param
* @Author: AaNeei
* @Date: 2019/10/16 22:36
* @Description: 游学网
* @throws:
*/
public class Client {
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
Originator originator = new Originator();
originator.setStatus("状态1");
caretaker.add(originator.saveStatusMemento());
originator.setStatus("状态2");
caretaker.add(originator.saveStatusMemento());
originator.setStatus("状态3");
caretaker.add(originator.saveStatusMemento());
System.out.println("当前状态为:" +originator.getStatus());
originator.getStatusFromMemento(caretaker.get(0));
System.out.println("恢复状态1,当前状态为:" +originator.getStatus());
}
}
四,源码分析
spring-web-flow源码中使用的备忘录模式,如org.springframework.binding.message.StateManageableMessageContext;
public interface StateManageableMessageContext extends MessageContext {
/**
* Create a serializable memento, or token representing a snapshot of the internal state of this message context.
* @return the messages memento
*/
public Serializable createMessagesMemento();
/**
* Set the state of this context from the memento provided. After this call, the messages in this context will match
* what is encapsulated inside the memento. Any previous state will be overridden.
* @param messagesMemento the messages memento
*/
public void restoreMessages(Serializable messagesMemento);
/**
* Configure the message source used to resolve messages added to this context. May be set at any time to change how
* coded messages are resolved.
* @param messageSource the message source
* @see MessageContext#addMessage(MessageResolver)
*/
public void setMessageSource(MessageSource messageSource);
}