设计模式之备忘录模式

转载请注明地址: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);
	}
}

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中保存的信息还原到迁移状态。

命令模式支持命令的撤销操作,命令模式也可以使用备忘录模式。

你可能感兴趣的:(设计模式,备忘录模式)