转载请注明地址:http://blog.csdn.net/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); } }
public class State { public String mState; public State(String state){ mState = state; } public State(){ this("存档丢失"); } }
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中保存的信息还原到迁移状态。
命令模式支持命令的撤销操作,命令模式也可以使用备忘录模式。