备忘录模式

本文概述

  • 好处
  • 用法
  • UML for Memento模式
  • Memento模式的实现
备忘录模式说“将对象的状态恢复到其先前的状态”。但是它必须做到这一点而不会违反封装。这种情况在发生错误或故障时很有用。
备忘录模式也称为令牌。
撤消或退格或Ctrl + Z是编辑器中最常用的操作之一。 Memento设计模式用于实现撤消操作。这是通过在对象更改状态时保存其当前状态来完成的。
好处
  • 它保留封装边界。
  • 它简化了创建者。
用法
  • 大多数软件在撤消和重做操作中使用它。
  • 它也用于数据库事务中。
UML for Memento模式
备忘录模式

文章图片
备忘录:
  • 存储原始对象的内部状态。状态可以包括任意数量的状态变量。
  • 备忘录必须具有两个接口, 即看守者的接口。该接口不得允许任何操作或对内存的存储的内部状态的任何访问, 并因此保持封装。另一个接口是发起者, 它允许发起者访问发起者恢复先前状态所必需的任何状态变量。
鼻祖:
  • 创建一个备忘录对象, 该对象将捕获发起者的内部状态。
  • 使用memento对象恢复其先前状态。
看守:
  • 负责保留备忘录。
  • 备忘录对看守人是透明的, 看守人不得对其进行操作。
Memento模式的实现 步骤1:
创建一个Originator类, 该类将使用Memento对象恢复其先前状态。
//This is a class.public class Originator { private String state; public void setState(String state){ this.state = state; } public String getState(){ return state; } public Memento saveStateToMemento(){ return new Memento(state); } public void getStateFromMemento(Memento Memento){ state = Memento.getState(); } }// End of the Originator class.

第2步:
创建一个Memento类, 该类将存储Originator对象的内部状态。
//This is a class.public class Memento { private String state; public Memento(String state) { this.state=state; } public String getState() { return state; } }// End of the Memento class.

第三步:
创建一个负责维护Memento的Caretaker类。
//This is a class.import java.util.ArrayList; import java.util.List; public class Caretaker { private List< Memento> mementoList = new ArrayList< Memento> (); public void add(Memento state){ mementoList.add(state); }public Memento get(int index){ return mementoList.get(index); }}// End of the Caretaker class.

步骤4:
创建一个MementoPatternDemo类。
//This is a class.public class MementoPatternDemo { public static void main(String[] args) {Originator originator = new Originator(); Caretaker careTaker = new Caretaker(); originator.setState("State #1"); careTaker.add(originator.saveStateToMemento()); originator.setState("State #2"); careTaker.add(originator.saveStateToMemento()); originator.setState("State #3"); careTaker.add(originator.saveStateToMemento()); originator.setState("State #4"); System.out.println("Current State: " + originator.getState()); originator.getStateFromMemento(careTaker.get(0)); System.out.println("First saved State: " + originator.getState()); originator.getStateFromMemento(careTaker.get(1)); System.out.println("Second saved State: " + originator.getState()); originator.getStateFromMemento(careTaker.get(2)); System.out.println("Third saved State: " + originator.getState()); }} // End of the MementoPatternDemo class.

【备忘录模式】输出:
备忘录模式

文章图片

    推荐阅读