zoukankan      html  css  js  c++  java
  • 【HeadFirst 设计模式学习笔记】21 备忘录(Memento)模式拾零

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    1.概述

    这个模式也比较简单,书中没有提到。用于恢复上次操作结果等场景,比如数据库回滚等。这个模式有三个参与的实体:

    Originator:知道如何保存自己的对象。

    Caretaker:知道Originator何时以及为何保存并恢复自己的对象。

    Memento:由Originator进行读写,并且Caretaker完成维护的对象

    2.实例

    首先,我们创建一个Memento:

      1: class Memento {
    
      2:    private String state;
    
      3: 
    
      4:    public Memento(String stateToSave) { state = stateToSave; }
    
      5:    public String getSavedState() { return state; }
    
      6: }
    
      7: 
    
      8: 

    里面有我们希望保存的状态的存取方法。

    然后我们创建Originator:

      1: class Originator {
    
      2:    private String state;
    
      3:    /* lots of memory consumptive private data that is not necessary to define the 
    
      4:     * state and should thus not be saved. Hence the small memento object. */
    
      5: 
    
      6:    public void set(String state) { 
    
      7:        System.out.println("Originator: Setting state to "+state);
    
      8:        this.state = state; 
    
      9:    }
    
     10: 
    
     11:    public Memento saveToMemento() { 
    
     12:        System.out.println("Originator: Saving to Memento.");
    
     13:        return new Memento(state); 
    
     14:    }
    
     15:    public void restoreFromMemento(Memento m) {
    
     16:        state = m.getSavedState(); 
    
     17:        System.out.println("Originator: State after restoring from Memento: "+state);
    
     18:    }
    
     19: }   
    
     20: 

     

    提供了保存状态、恢复状态以及设置状态的接口。

    最后我们再实现Caretaker:

      1: class Caretaker {
    
      2:    private ArrayList savedStates = new ArrayList();
    
      3: 
    
      4:    public void addMemento(Memento m) { savedStates.add(m); }
    
      5:    public Memento getMemento(int index) { return savedStates.get(index); }
    
      6: }   
    
      7: 

    在这里面提供了对Memento的维护的相关存取接口。

    到此,我们就可以写一段测试程序来看看这个备忘录模式是不是能正常工作:

      1: class MementoExample {
    
      2:    public static void main(String[] args) {
    
      3:        Caretaker caretaker = new Caretaker();
    
      4: 
    
      5:        Originator originator = new Originator();
    
      6:        originator.set("State1");
    
      7:        originator.set("State2");
    
      8:        caretaker.addMemento( originator.saveToMemento() );
    
      9:        originator.set("State3");
    
     10:        caretaker.addMemento( originator.saveToMemento() );
    
     11:        originator.set("State4");
    
     12: 
    
     13:        originator.restoreFromMemento( caretaker.getMemento(1) );
    
     14:    }
    
     15: }
    
     16: 
    
     17: 
    
     18: 

    3.UML

    Memento

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

  • 相关阅读:
    springboot scheduled多线程
    Oracle sql 小数点前面0不显示
    (转)VIM常用命令集锦
    java 面试题
    关于oracle start with connect by 全表扫描的一点想法
    (转)window.opener方法的使用 刷新父页面
    (转)jQuery “not readonly” selector
    (转)jquery合并单元格
    Java 格式化json为json树
    我的2018
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2827670.html
Copyright © 2011-2022 走看看