设计模式-备忘录模式

1、备忘录模式:在不破坏封装的前提下,存储关键对象的重要状态,从而可以在将来吧对象还原到存储的哪个状态

关键代码:客户不与备忘录类耦合,与备忘录管理类耦合。

应用实例: 1、后悔药。
2、打游戏时的存档。
3、Windows 里的 ctri + z。 4、IE 中的后退。
4、数据库的事务管理。

优点:
1)状态存储在外面,不和关键对象混在一起,可以帮助维护内聚
2)提供了容易实现的恢复能力
3)保持了关键对象的数据封装

缺点
1)存储和恢复状态的过程比较耗时

2、实现
备忘录模式使用三个类 Memento、Originator 和 CareTaker。
Memento 包含了要被恢复的对象的状态。
Originator 创建并在 Memento 对象中存储状态。
Caretaker 对象负责从 Memento 中恢复对象的状态。
MementoPatternDemo,演示类,使用 CareTaker 和 Originator 对象来显示对象的状态恢复。

Image text

1)创建 Memento类

1
2
3
4
5
6
7
8
9
10
11
public class Memento {
private String state;

public Memento(String state){
this.state = state;
}

public String getState(){
return state;
}
}

2)创建 Originator 类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
}
}

3)创建 CareTaker 类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);
}
}

4)创建 Originator和CareTaker对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
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());
}
}

输出

1
2
3
Current State: State #4
First saved State: State #2
Second saved State: State #3

参考:http://www.runoob.com/design-pattern/memento-pattern.html