转载请注明地址:http://blog.youkuaiyun.com/droyon/article/details/21165179
备忘录模式:在不破坏封装性的情况下,捕捉一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复原先的状态。
类图:
Originator:创建备忘录,并可使用备忘录恢复内部状态。
Mementor:存储Originator状态,并可防止Orignator以外的其他对象访问备忘录Mementor。
Caretaker:负责保存备忘录对象。
案例模拟:
爱琴公寓中,关谷和唐悠悠的爱情可谓顺风顺水,愿意你是因为他们可以在吵架时存档,下次读档接着在吵。或者将甜蜜爱情时光存档,当要吵架时,读档。
我们现在来模拟这个过程:
YYAndGG.java(Orignator)
/**
* 关于类名 YYAndGG == YouYouAndGuanGu(悠悠和关谷)
* @author wanghl
*
*/
public class YYAndGG {
private String mLovingState = "日子风平浪静,关谷和悠悠爱情稳定";
/**
* 是情侣就会吵架,但吵架是读书少的表现
*/
public void quarrel(){
mLovingState = "关谷和悠悠吵架了。。。。";
}
public void lovingTime(String something){
mLovingState = something;
}
/**
* 读档
* @param state
*/
public void restore(String index){
State state = StateBackList.getStore(index);
mLovingState = state.mState;
}
public void saveStore(String index){
StateBackList.saveStore(index, new State(mLovingState));
}
public void displayLovingState(){
System.out.println(mLovingState);
}
}
State.java(memento)
public class State {
public String mState;
public State(String state){
mState = state;
}
public State(){
this("存档丢失");
}
}
StateBackList.java(CareTaker)
import java.util.HashMap;
public class StateBackList {
private static HashMap<String, State> mStore = new HashMap<String, State>();
public static void saveStore(String index,State state){
mStore.put(index, state);
}
public static State getStore(String index){
State state = mStore.get(index);
if(state == null)return new State();
return state;
}
}
测试代码:
LovingHome.java
/**
* 悠悠和关谷在爱情公寓的爱情故事
* @author wanghl
*
*/
public class LovingHome {
public static void main(String args[]){
//日子风平浪静
YYAndGG yyAndgg = new YYAndGG();
yyAndgg.displayLovingState();
//进行一场烛光晚餐
yyAndgg.lovingTime("关谷和悠悠,共同享受一场浪漫的烛光晚餐");
yyAndgg.displayLovingState();
//美好的恋爱时光,存档
yyAndgg.saveStore("烛光晚餐");
//关谷和悠悠吵架了
yyAndgg.quarrel();
yyAndgg.displayLovingState();
//发现吵架很累,想回复到烛光晚餐时的恋爱时光状态
yyAndgg.restore("烛光晚餐");
yyAndgg.displayLovingState();
}
}
打印输出:
日子风平浪静,关谷和悠悠爱情稳定
关谷和悠悠,共同享受一场浪漫的烛光晚餐
关谷和悠悠吵架了。。。。
关谷和悠悠,共同享受一场浪漫的烛光晚餐
总结:把备忘录备份的对象封装在Memento中,那一天需要更改保存的细节,可以做到不更改客户端。
备忘录模式适用于功能比较复杂,但需要维护或记录属性历史的类,或者需要保存的属性只是众多属性中的一部分时,Originator可以根据Memento中保存的信息还原到迁移状态。
命令模式支持命令的撤销操作,命令模式也可以使用备忘录模式。