【设计模式】备忘录模式

简介:

什么是备忘录模式

保存对象的某个状态并可以恢复到该状态

补充说明

例子很多,如回退 ctri + z,回滚,ps恢复到操作历史的某一刻等等。。。

角色

备忘录角色:存储状态

发起人角色:创建备忘录,并利用备忘录存储自己的状态

负责人:管理备忘录

客户端

例子,JAVA实现

例子描述:显示一个对象的历史状态

备忘录角色:存储发起人的状态

复制代码
package dp.memento;

public class Memento {
  private String state;
  private float x;
  private float y;

  public Memento(String state, float x, float y) {
    this.state = state;
    this.x = x;
    this.y = y;
  }

  
  /**
   * getState.
   * @return the state
   */
  public String getState() {
    return state;
  }

  
  /**
   * setState.
   * @param state the state to set
   */
  public void setState(String state) {
    this.state = state;
  }

  
  /**
   * getX.
   * @return the x
   */
  public float getX() {
    return x;
  }

  
  /**
   * setX.
   * @param x the x to set
   */
  public void setX(float x) {
    this.x = x;
  }

  
  /**
   * getY.
   * @return the y
   */
  public float getY() {
    return y;
  }

  
  /**
   * setY.
   * @param y the y to set
   */
  public void setY(float y) {
    this.y = y;
  }

}
复制代码

发起人角色,希望存储自己的历史状态

复制代码
package dp.memento;

public class Originator {

  private String state;
  private float x;
  private float y;

  public String getState() {
    return state;
  }

  public void setState(String state) {
    this.state = state;
  }

  public Memento saveToMemento() {
    return new Memento(state, x, y);
  }

  public void restoreFromMemento(Memento memento) {
    this.state = memento.getState();
    this.x = memento.getX();
    this.y = memento.getY();
  }

  
  /**
   * getX.
   * @return the x
   */
  public float getX() {
    return x;
  }

  
  /**
   * setX.
   * @param x the x to set
   */
  public void setX(float x) {
    this.x = x;
  }

  
  /**
   * getY.
   * @return the y
   */
  public float getY() {
    return y;
  }

  
  /**
   * setY.
   * @param y the y to set
   */
  public void setY(float y) {
    this.y = y;
  }
}
复制代码

备忘录管理者(保存发起人的历史状态记录)

复制代码
package dp.memento;

public class Originator {

  private String state;
  private float x;
  private float y;

  public String getState() {
    return state;
  }

  public void setState(String state) {
    this.state = state;
  }

  public Memento saveToMemento() {
    return new Memento(state, x, y);
  }

  public void restoreFromMemento(Memento memento) {
    this.state = memento.getState();
    this.x = memento.getX();
    this.y = memento.getY();
  }

  
  /**
   * getX.
   * @return the x
   */
  public float getX() {
    return x;
  }

  
  /**
   * setX.
   * @param x the x to set
   */
  public void setX(float x) {
    this.x = x;
  }

  
  /**
   * getY.
   * @return the y
   */
  public float getY() {
    return y;
  }

  
  /**
   * setY.
   * @param y the y to set
   */
  public void setY(float y) {
    this.y = y;
  }
}
复制代码

客户端Main

复制代码
package dp.memento;

public class Main {

  public static void main(String[] args) {
    Originator originator = new Originator();     //发起人
    MementoMgt mementoMgt = new MementoMgt();     //备忘录管理,负责存储历史状态

    originator.setState("2017-01-01");
    originator.setX(1.4f);
    originator.setY(5.4f);
    mementoMgt.add(originator.saveToMemento());    //记录状态
    
    originator.setState("2017-04-03");
    originator.setX(44.4f);
    originator.setY(52.4f);
    mementoMgt.add(originator.saveToMemento());    //记录状态
    
    originator.setState("2017-06-01");
    originator.setX(231.4f);
    originator.setY(555.4f);
    mementoMgt.add(originator.saveToMemento());    //记录状态
    
    originator.setState("2017-06-22");
    originator.setX(132.4f);
    originator.setY(53.4f);
    mementoMgt.add(originator.saveToMemento());    //记录状态

    System.out.println("状态历史:");
    for (Memento m : mementoMgt.getMementoList()) {
      System.out.println(m.getState() + ": " + m.getX() + ", " + m.getY());
    }

    System.out.println("当前状态:");
    System.out.println(originator.getState() + ": " + originator.getX() + ", " + originator.getY());
    
    originator.restoreFromMemento(mementoMgt.getByState("2017-04-03")); //恢复到指定状态--2017-04-03
    System.out.println("恢复后的状态:");
    System.out.println(originator.getState() + ": " + originator.getX() + ", " + originator.getY());
  }
}
复制代码

结果打印:

状态历史:
2017-01-01: 1.4, 5.4
2017-04-03: 44.4, 52.4
2017-06-01: 231.4, 555.4
2017-06-22: 132.4, 53.4
当前状态:
2017-06-22: 132.4, 53.4
恢复后的状态:
2017-04-03: 44.4, 52.4

本文转自风一样的码农博客园博客,原文链接:http://www.cnblogs.com/chenpi/p/5222287.html,如需转载请自行联系原作者

相关文章
|
5月前
|
设计模式 存储 Java
23种设计模式,备忘录模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】备忘录模式是一种行为设计模式,它能在不破坏对象封装的前提下,捕获并保存对象的当前状态,以便后面可以恢复到这个状态。
73 0
|
5月前
|
设计模式 存储 Java
【设计模式】备忘录模式
【设计模式】备忘录模式
|
5月前
|
设计模式 存储 Java
浅谈设计模式 - 备忘录模式(十五)
浅谈设计模式 - 备忘录模式(十五)
44 0
|
5月前
|
设计模式 存储 Java
Java设计模式【十九】:备忘录模式
Java设计模式【十九】:备忘录模式
37 0
|
8天前
|
存储 设计模式 安全
Java设计模式-备忘录模式(23)
Java设计模式-备忘录模式(23)
|
2月前
|
设计模式 算法
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
设计模式的基础问题之备忘录模式在软件开发的问题如何解决
|
3月前
|
设计模式 数据处理
iLogtail设计模式问题之什么是备忘录模式
iLogtail设计模式问题之什么是备忘录模式
|
4月前
|
设计模式
备忘录模式-大话设计模式
备忘录模式-大话设计模式
|
4月前
|
设计模式 存储 Java
Java设计模式之备忘录模式详解
Java设计模式之备忘录模式详解
|
5月前
|
存储 设计模式 安全
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道
备忘录模式是一种行为设计模式,允许在不破坏对象封装性的情况下保存和恢复对象的内部状态。该模式通过创建备忘录对象来存储发起人的状态信息,发起人可根据需要创建和恢复备忘录。管理者则负责保存和管理备忘录,但无法访问其内容。备忘录模式简化了状态管理,支持撤销操作和历史记录功能,提高了系统的灵活性和可用性。在实际应用中,备忘录模式常用于文本编辑器、游戏和数据库事务处理等场景,确保对象状态的安全恢复和有效管理。通过备忘录模式,开发人员可以更好地控制对象状态的变化,提升软件系统的健壮性和用户体验。
85 1
探索设计模式的魅力:备忘录模式揭秘-实现时光回溯、一键还原、后悔药、历史的守护者和穿越时空隧道