当前位置: 移动技术网 > IT编程>开发语言>Java > 详解备忘录模式及其在Java设计模式编程中的实现

详解备忘录模式及其在Java设计模式编程中的实现

2019年07月22日  | 移动技术网IT编程  | 我要评论

精神病女子穿婚纱跳河找孩子,烤骆驼,班门弄斧

1. 定义
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

2. 使用的原因
想要恢复对象某时的原有状态。

3. 适用的情况举例
有很多备忘录模式的应用,只是我们已经见过,却没细想这是备忘录模式的使用罢了,略略举几例:
eg1. 备忘录在jsp+javabean的使用:
在一系统中新增帐户时,在表单中需要填写用户名、密码、联系电话、地址等信息,如果有些字段没有填写或填写错误,当用户点击“提交”按钮时,需要在新增页面上保存用户输入的选项,并提示出错的选项。这就是利用javabean的scope="request"或scope="session"特性实现的,即是用备忘录模式实现的。
eg2. 修理汽车的刹车时。首先移开两边的挡板,露出左右刹车片。只能卸下一片,这时另一片作为一个备忘录来表明刹车是怎样安装的。在这片修理完成后,才可以卸下另一片。当第二片卸下时,第一片就成了备忘录。
eg3. 都说人生没有后悔药可买,我们都在为所做的事付出着代价,但在软世界里却有“后悔药”,我改变了某东西的某些状态之后,只要我们之前保存了该东西的某状态,我们就可以通过备忘录模式实现该东西的状态还原,其实这何尝不是一个能使时光倒流的“月光宝盒”,总“神奇”一词了得。

4. 类图结构及说明
(1)类图如下所示:

201642993348501.jpg (466×148)

(2)类说明           
(i)memento:备忘录角色,  主要负责的工作如下:
将发起人对象的内部状态存储起来;
可以保护其内容不被发起人(originator)对象之外的任何对象所读取。
(ii)originator:发起人角色,主要完成如下工作:
创建一个含有当前的内部状态的备忘录对象;
使用备忘录对象存储其内部状态。
(iii)caretaker:负责人角色,完成工作如下:
负责保存备忘录对象;
不保存备忘录对象的内容。      

5.实例

/** 
 * 数据对象 
 */ 
public class datastate { 
  private string action; 
 
  public void setaction(string action) { 
    this.action = action; 
  } 
   
  public string getaction() { 
    return action; 
  } 
 
} 
/** 
 * 一个保存另外一个对象内部状态拷贝 的对象.这样以后就可以将该对象恢复到原先保存的状态. 
 */ 
import java.io.file; 
import java.io.serializable; 
 
public class memento implements serializable { 
 
  /*private int number; 
  private file file = null; 
 
  public memento(originator o) { 
    this.number = o.getnumber(); 
    this.file = o.getfile(); 
  } 
 
  public int getnumber() { 
    return this.number; 
  } 
 
  public void setnumber(int number) { 
    this.number = number; 
  } 
 
  public file getfile() { 
    return this.file; 
  } 
 
  public void setfile(file file) { 
    this.file = file; 
  } 
*/ 
  private datastate state; 
  public memento(originator o) { 
    this.state = o.getstate(); 
  } 
   
  public datastate getstate() { 
    return state; 
  } 
   
  public void setstate(datastate state) { 
    this.state = state; 
  } 
} 

public class originator { 
 
/* private int number; 
  private file file = null; 
 
  public originator() { 
 
  } 
 
  // 创建一个memento,将自身作为参数传入 
  public memento getmemento() { 
    return new memento(this); 
  } 
 
  // 从memento中取出保存的数据,恢复为原始状态 
  public void setmemento(memento m) { 
    number = m.getnumber(); 
    file = m.getfile(); 
  } 
 
  public int getnumber() { 
    return number; 
  } 
 
  public void setnumber(int number) { 
    this.number = number; 
  } 
 
  public file getfile() { 
    return file; 
  } 
 
  public void setfile(file file) { 
    this.file = file; 
  }*/ 
   
  private datastate state; 
  public originator() { 
     
  } 
   
  public originator(datastate state) { 
    this.state = state; 
  } 
   
  // 创建一个memento,将自身作为参数传入 
  public memento getmemento() { 
    return new memento(this); 
  } 
   
  // 从memento中取出保存的数据,恢复为原始状态 
  public void setmemento(memento m) { 
    /* 
     * getmemento() 创建的对象,保存在某个容器里, 
     * 当需要恢复时,将其传入当前方法, 再使用getstate(),得出 
     */ 
    this.state = m.getstate(); 
  } 
   
  public datastate getstate() { 
    return state; 
  } 
   
  public void setstate(datastate state) { 
    this.state = state; 
  } 
} 

/* 
 * originator用于 加载数据, 建立memento对象,及通过memento恢复原始数据 
 */ 
public class test { 
  public static void main(string[] args) { 
     
//   originator originator = new originator(); 
//   originator.setnumber(8); 
//    
//   memento memento = originator.getmemento(); 
//   system.out.println(memento.getnumber()); 
     
    datastate state = new datastate(); 
    state.setaction("copy a character"); 
    originator originator = new originator(); 
    system.out.println("创建原始数据"); 
    originator.setstate(state); 
     
    system.out.println("创建备忘录对象, 保存原始数据状态"); 
    memento memento = originator.getmemento(); 
     
    system.out.println("创建了一个新数据"); 
    originator.setstate(new datastate()); 
 
    system.out.println("创建新数据后:" + originator.getstate().getaction()); 
     
    /* 
     * memento 需要保存在某地,需要时取出,以恢复它内部所保存的数据 
     */ 
    system.out.println("创建新数据后,恢复原数据"); 
    originator.setmemento(memento); 
    system.out.println(originator.getstate().getaction()); 
  } 
} 

打印:

创建原始数据 
创建备忘录对象, 保存原始数据状态 
创建了一个新数据 
创建新数据后:null 
创建新数据后,恢复原数据 
copy a character 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网