设计模式之备忘录模式

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:47   1433   0

转载请注明地址: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中保存的信息还原到迁移状态。

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP