📢 この記事は gemini-3-flash-preview によって翻訳されました
メメント・パターン(Memento Pattern)オブジェクト振る舞い型パターン
意図
カプセル化を壊さずにオブジェクトの内部状態をキャプチャして、それをオブジェクトの外に保存しておくこと。そうすれば、後でオブジェクトを元の状態に戻せるようになるんだ。
構造

それぞれの役割はこんな感じ:
- Memento(メメント): Originator(作成者)オブジェクトの内部状態を保存する。Originator が必要に応じて、どの内部状態を保存するかを決めるんだ。Originator 以外のオブジェクトがメメントにアクセスするのを防ぐ役割もあるよ。
- Originator(作成者): 現在の内部状態を記録するためのメメントを作成する。また、メメントを使って内部状態を復元するのもこの役割だよ。
- Caretaker(管理者): メメントを適切に保管する責任がある。ただし、メメントの内容を操作したりチェックしたりはできないんだ。
どんな時に使う?
メメント・パターンはこんな時に役立つよ:
- オブジェクトのある時点での(一部の)状態を保存しておいて、後で必要になった時にその状態に戻さなきゃいけない場合。
- もし、他のオブジェクトが直接その状態を取得できるようなインターフェースを作ってしまうと、実装の詳細が漏れてカプセル化が壊れてしまうような場合。
例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
| import java.util.ArrayList;
import java.util.List;
public class MementoPattern {
public static void main(String[] args) {
Caretaker caretaker = new Caretaker();
Originator originator = new Originator();
originator.setState("first");
Memento memento1 = originator.createMemento();
caretaker.addMemento(memento1);
originator.setState("second");
Memento memento2 = originator.createMemento();
caretaker.addMemento(memento2);
originator.setState("third");
Memento memento3 = originator.createMemento();
caretaker.addMemento(memento3);
caretaker.showMemento();
Memento backup = caretaker.getMemento(2);
originator.setMemento(backup);
System.out.println("=========");
System.out.println(originator.getState());
}
}
class Originator{ // 作成者
private String state;
public void setState(String state){
this.state = state;
}
public String getState(){
return state;
}
public Memento createMemento(){
return new Memento(state);
}
public void setMemento(Memento memento){
state = memento.getState();
}
}
class Memento{ // メメント
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
class Caretaker{ // 管理者
private List<Memento> mementoList = new ArrayList<>();
public void addMemento(Memento memento){
mementoList.add(memento);
}
public Memento getMemento(int index){
return mementoList.get(index - 1);
}
public void showMemento(){
int i = 1;
for(Memento m : mementoList){
System.out.println("No." + i + ": " + m.getState());
i++;
}
}
}
|