• 技术文章 >Java >java教程

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

    高洛峰高洛峰2017-01-19 15:37:56原创522
    1. 定义
    在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

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

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

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

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

    (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

    更多详解备忘录模式及其在Java设计模式编程中的实现相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:java设计模式之实现对象池模式示例 下一篇:详解Java设计模式之备忘录模式的使用

    相关文章推荐

    • 动态代理的两种方式是什么• Java基础之类和对象、单例模式、继承• JAVA-5NIO之Selector• java提高篇(七)-----详解内部类• 13个不容错过的Java项目

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网