本文概述
备忘录模式说“将对象的状态恢复到其先前的状态”。但是它必须做到这一点而不会违反封装。这种情况在发生错误或故障时很有用。
备忘录模式也称为令牌。
撤消或退格或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.
输出:
评论前必须登录!
注册