βοΈ Java Design-Pattern Xβ ¨ - Memento
βοΈ Java Design-Pattern Xβ
¨ - Memento
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Memento
ν¨ν΄μ΄λ?
- κ°λ Ή ν μ€νΈ μλν°λ₯Ό μ¬μ©ν λ μ€μλ‘ νμν ν μ€νΈλ₯Ό μμ νλλΌλ μ€ν μ·¨μ κΈ°λ₯μ ν΅ν΄ μμ νκΈ° μ μνλ‘ ν μ€νΈλ₯Ό 볡μν μ μλ€.
- κ°μ²΄μ§ν₯ νλ‘κ·Έλ¨μΌλ‘ μ€ν μ·¨μλ₯Ό ꡬννλ €λ©΄ μΈμ€ν΄μ€κ° κ°μ§ μ 보λ₯Ό μ μ₯ν΄ λμ΄μΌ νλ€.
- μΈμ€ν΄μ€λ₯Ό 볡μνκΈ° μν΄μλ μΈμ€ν΄μ€ λ΄λΆ μ 보μ μμ λ‘κ² μ κ·Όν μ μμ΄μΌ νλλ°, λΆμ£Όμνκ² μ κ·Όμ νλ½ν΄ λ²λ¦¬λ©΄, ν΄λΉ ν΄λμ€μ λ΄λΆ ꡬ쑰μ μμ‘΄νλ μ½λκ° νλ‘κ·Έλ¨ κ³³κ³³μ ν©μ΄μ Έ ν΄λμ€λ₯Ό μμ νκΈ° κ³€λν΄μ§κ³ , μ΄λ₯Ό μΊ‘μνμ νκ΄΄λΌκ³ νλ€.
- μΈμ€ν΄μ€μ μνλ₯Ό λνλ΄λ μν μ λμ
ν΄, μΊ‘μνμ νκ΄΄μ λΉ μ§μ§ μκ³ μ μ₯κ³Ό 볡μμ νλ κ²μ΄
Memento
ν¨ν΄μ΄λ€. Memento
ν¨ν΄μ μ΄μ©νλ©΄ λ€μκ³Ό κ°μ μΌμ μνν μ μλ€.
- μ€ν μ·¨μ(
Undo
) - λ€μ μ€ν(
Redo
) - μμ
μ΄λ ₯ μμ±(
History
) - νμ¬ μν μ μ₯(
Snapshot
)
μμ νλ‘κ·Έλ¨
- λ€μμ βκ³ΌμΌ λͺ¨μΌκΈ° μ£Όμ¬μ κ²μβμ μ£Όμ λ‘ ν μμ νλ‘κ·Έλ¨μ΄λ€.
- κ·μΉμ λ€μκ³Ό κ°λ€.
- μ΄ κ²μμ μλμΌλ‘ μ§νλ©λλ€.
- κ²μ μ£ΌμΈκ³΅μ΄ μ£Όμ¬μλ₯Ό λμ Έμ λμ¨ μκ° λ€μ μνλ₯Ό κ²°μ ν©λλ€.
- μ’μ μκ° λμ€λ©΄ μ£ΌμΈκ³΅μ λμ΄ λμ΄λ©λλ€.
- λμ μκ° λμ€λ©΄ λμ΄ μ€μ΄λλλ€.
- νΉν μ’μ μκ° λμ€λ©΄ μ£ΌμΈκ³΅μ κ³ΌμΌμ λ°μ΅λλ€.
- λμ΄ μμ΄μ§λ©΄ μ’ λ£ν©λλ€.
- νλ‘κ·Έλ¨ μμμλ λμ΄ λͺ¨μμ λ λ―Έλλ₯Ό μν΄
Memento
ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό λ§λ€κ³ , νμ¬ μνλ₯Ό μ μ₯νλ€. - μ μ₯ν κ²μ νμ¬ κ°μ§ λκ³Ό κ³ΌμΌμ΄λ€.
- λ§μ½ κ³μ μ Έμ λμ΄ μ€μ΄λ€λ©΄, λμ΄ μμ΄μ Έμ μ’
λ£λμ§ μλλ‘ κΈ°μ‘΄μ μ μ₯ν΄ λ
Memento
μΈμ€ν΄μ€λ‘ μ΄μ μνλ₯Ό 볡μνλ€.
Memento
ν΄λμ€
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
package game;
import java.util.ArrayList;
import java.util.List;
public class Memento {
private int money;
private List<String> fruits;
/* μμ±μ(wide interface) */
Memento(int money) {
this.money = money;
this.fruits = new ArrayList<>();
}
/* μμ§κΈμ μ»λλ€.(narrow interface) */
public int getMoney() {
return money;
}
/* κ³ΌμΌμ μΆκ°νλ€.(wide interface) */
void addFruit(String fruit) {
fruits.add(fruit);
}
/* κ³ΌμΌμ μ»λλ€.(wide interface) */
List<String> getFruits() {
return new ArrayList<>(fruits);
}
}
Memento
λ μ£ΌμΈκ³΅μ μνλ₯Ό λνλ΄λ ν΄λμ€μ΄λ€.Memento
ν΄λμ€μ μμ±μμλpublic
μ΄ μλ€.- λ°λΌμ ν΄λΉ ν΄λμ€μ μΈμ€ν΄μ€λ μ무λ λ§λ€ μ μκ³ , λμΌν ν¨ν€μ§μ μν ν΄λμ€μμλ§ μ¬μ©ν μ μλ€.
addFruit()
λ©μλλ κ³ΌμΌμ μΆκ°νλ λ©μλλ‘, μ΄ λν ν¨ν€μ§ μΈλΆμμMemento
λ΄λΆλ₯Ό λ³κ²½ν μ μλ€.
Gamer
ν΄λμ€
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
package game;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Gamer {
private int money;
private List<String> fruits = new ArrayList<>();
private Random random = new Random();
private static String[] fruitsName = {
"μ¬κ³Ό", "ν¬λ", "λ°λλ", "μ€λ μ§"
};
public Gamer(int money) {
this.money = money;
}
public int getMoney() {
return money;
}
public void bet() {
int dice = random.nextInt(6) + 1;
if (dice == 1) {
money += 100;
System.out.println("μμ§κΈμ΄ μ¦κ°νμ΅λλ€.");
} else if (dice == 2) {
money /= 2;
System.out.println("μμ§κΈμ΄ μ λ°μΌλ‘ μ€μμ΅λλ€.");
} else if (dice == 6) {
String f = getFruit();
System.out.println("κ³ΌμΌ(" + f + ")λ₯Ό λ°μμ΅λλ€.");
fruits.add(f);
} else {
System.out.println("λ³λ μ¬νμ΄ μμ΅λλ€.");
}
}
public Memento createMemento() {
Memento m = new Memento(money);
for (String f : fruits) {
if (f.startsWith("λ§μλ ")) m.addFruit(f);
}
return m;
}
public void restoreMemento(Memento memento) {
this.money = memento.getMoney();
this.fruits = memento.getFruits();
}
@Override
public String toString() {
return "[money = " + money + ", fruits = " + fruits + "]";
}
private String getFruit() {
String f = fruitsName[random.nextInt(fruitsName.length)];
if (random.nextBoolean()) {
return "λ§μλ " + f;
} else {
return f;
}
}
}
- κ²μ μ£ΌμΈκ³΅μ λνλ΄λ ν΄λμ€λ‘, μμ§κΈ, κ³ΌμΌ, λμ μμ±κΈ°λ₯Ό κ°κ³ μλ€.
- κ²μμ μ€μ¬μ΄ λλ
bet()
λ©μλλ λ§μ½ μ£ΌμΈκ³΅μ΄ νμ°νμ§ μμλ€λ©΄ μ£Όμ¬μλ₯Ό λμ§κ³ κ·Έ λμ λ°λΌ μμ§κΈκ³Ό κ³ΌμΌ κ°μλ₯Ό λ³νμν¨λ€. createMemento()
λ©μλλ νμ¬ μνλ₯Ό μ μ₯νλ λ©μλμ΄λ€.- ν΄λΉ λ©μλλ₯Ό ν΅ν΄ λ§λ€μ΄μ§
Memento
μΈμ€ν΄μ€λ νμ¬ κ²μ μ£ΌμΈκ³΅μ μνλ₯Ό λνλΈλ€. - κ³ΌμΌμ λν΄μλ λ§μλ κ²λ§ μ μ₯νλλ‘ νλ€.
restoreMemento()
λ©μλλ λ°λλ‘ μ€νμ μ·¨μνλ λ©μλμ΄λ€.- μ£Όμ΄μ§
Memento
μΈμ€ν΄μ€λ₯Ό λ°νμΌλ‘ μμ μ μνλ₯Ό 볡μνλ€.
Main
ν΄λμ€
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
import game.Memento;
import game.game.Gamer;
public class Main {
public static void main(String[] args) {
/* κ²μ΄λ¨Έ μμ± λ° μν μ μ₯ */
Gamer gamer = new Gamer(100);
Memento memento = gamer.createMemento();
/* κ²μ μμ */
for (int i = 0; i < 100; i++) {
System.out.println("==== " + i);
System.out.println("μν:" + gamer);
gamer.bet();
System.out.println("μμ§κΈμ " + gamer.getMoney() + "μμ΄ λμμ΅λλ€.");
if (gamer.getMoney() > memento.getMoney()) {
System.out.println("λ§μ΄ λ²μμΌλ νμ¬ μνλ₯Ό μ μ₯νμ !");
memento = gamer.createMemento();
} else if (gamer.getMoney() < memento.getMoney()) {
System.out.println("λ§μ΄ μ€μμΌλ μ΄μ μνλ₯Ό 볡μνμ !");
gamer.restoreMemento(memento);
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) { }
System.out.println();
}
}
Main
ν΄λμ€μμλGamer
μΈμ€ν΄μ€λ₯Ό λ§λ€μ΄ κ²μμ μ§ννλ€.- μ΄ μ’κ² μμ§κΈμ΄ λμ΄λλ©΄ νμ¬ μνλ₯Ό μ μ₯νκ³ , μμ§κΈμ΄ μ€μ΄λ€λ©΄ μ΄μ μνλ‘ λ³΅μνλ€.
Memento
ν¨ν΄μ λ±μ₯μΈλ¬Ό
Gamer
ν΄λμ€
- μμ μ νμ¬ μνλ₯Ό μ μ₯νκ³ μΆμ λ μ€λ
μ·μ λ§λ€κ³ , μ΄μ
Memento
λ₯Ό λ°μΌλ©΄ κ·Έ μμ μ μνλ‘ λλ리λ μ²λ¦¬λ₯Ό νλ μμ±μ(Originator
) μμ λ§‘μλ€.
Memento
ν΄λμ€
- μμ±μμ λ΄λΆ μ 보λ₯Ό μ 리νλ©°, ν΄λΉ μ 보λ₯Ό λꡬμκ²λ 곡κ°νμ§λ μλλ€.
Memento
λ λ€μκ³Ό κ°μ λ μ’ λ₯μ μΈν°νμ΄μ€λ₯Ό κ°κ³ μλ€.
wide interface
... λμ μΈν°νμ΄μ€
- μ€λΈμ νΈμ μνλ₯Ό λλ리λ λ° νμν μ 보λ₯Ό λͺ¨λ μ»μ μ μλ λ©μλ μ§ν©
- λμ μΈν°νμ΄μ€λ
Memento
μ λ΄λΆ μνλ₯Ό λλ¬λ΄κΈ° λλ¬Έμ μ΄λ₯Ό μ¬μ©ν μ μλ κ²μOriginator
λΏμ΄λ€.
narrow interface
... μ’μ μΈν°νμ΄μ€
- μΈλΆ
Caretaker
μ 보μ¬μ£Όλ κ²μ μλ―Ένλ€. - μ’μ μΈν°νμ΄μ€λ‘ ν μ μλ μΌμλ νκ³κ° μμ΄ λ΄λΆ μνκ° μΈλΆμ 곡κ°λλ κ±Έ λ°©μ§νλ€.
- μΈλΆ
- μ΄ λ μ’ λ₯μ μΈν°νμ΄μ€λ₯Ό ꡬλ³ν΄μ μ¬μ©ν¨μΌλ‘μ¨ κ°μ²΄μ μΊ‘μν νκ΄΄λ₯Ό λ§μ μ μλ€.
- κΈ°λ
ν(
Memento
) μν μ λ§‘μλ€.
Main
ν΄λμ€
- μμ±μμ μνλ₯Ό μ μ₯νκ³ μΆμ λ μμ±μμ μμ²νκ³ , μμ±μλ κΈ°λ νμ λ§λ€μ΄ κ΄λ¦¬μΈμκ² λ겨μ€λ€.
- κ΄λ¦¬μΈμ λ―Έλμ λλΉνμ¬ κ·Έ κΈ°λ νμ μ μ₯ν΄μ€λ€.
Main
ν΄λμ€λ μ΄λ¬ν κ΄λ¦¬μΈ(Caretaker
) μμ λ§‘μλ€.- νμ§λ§ κ΄λ¦¬μΈμ μ’μ μΈν°νμ΄μ€λ§ μ¬μ©ν μ μμΌλ―λ‘
Memento
λ΄λΆ μ 보μ μ μν μ μκ³ , λ¨μ§ λ§λ€μ΄ μ€Memento
λ₯Ό ν λ©μ΄λ¦¬μ λΈλ λ°μ€λ‘ ν΅μ§Έλ‘ 보κ΄ν΄ λκΈ°λ§ νλ€. Originator
μMemento
λ λμ μΈν°νμ΄μ€λ‘ μ°κ²°λμ΄ μμ§λ§,Caretaker
μMemento
λ μ’μ μΈν°νμ΄μ€λ‘ μ°κ²°λμ΄ μμ΄Memento
λCaretaker
μ λν΄ μ 보λ₯Ό μννκ³ μλ€.
μ± μμ μ μνλ ννΈ
λ κ°μ μΈν°νμ΄μ€μ μ‘μΈμ€ μ μ΄
- μμ νλ‘κ·Έλ¨μμλ
Memento
ν¨ν΄μ λ±μ₯νλ λ μ’ λ₯μ μΈν°νμ΄μ€λ₯Ό μ€ννκ³ μJava
μ μ κ·Ό μ μ΄μ κΈ°λ₯μ μ¬μ©νλ€. - κ°λ Ή
Memento
ν΄λμ€μμλgetMoney()
λ©μλμλ§public
μ λΆμ¬ μ’μ μΈν°νμ΄μ€λ₯Ό ꡬννλ€. - ν΄λΉ λ©μλλ
Caretaker
μμMain
ν΄λμ€μμλ μ΄μ©ν μ μλ€. public
μ΄ νλλΌλ λΆμ΄ μλλ° μ’λ€λ 건 μ΄μν λλμ΄ λ€ μ μμ§λ§, μ’λ€λΌλ λ»μ λ΄λΆ μνλ₯Ό μ‘°μν μ μλ μ λκ° μ λ€λ κ²μ μλ―Ένλ€.- μ¦ ν μ μλ μΌμ μμ§κΈμ μ»λ κ²κ³Ό ν΄λΉ μΈμ€ν΄μ€λ₯Ό λ³μμ μ μ₯ν΄λλ κ² λΏμ΄λ€.
Memento
μΈμ€ν΄μ€λ μ§μ μμ±νμ§ λͺ»νκ³ ,Gamer
ν΄λμ€μ λΆννλ μ λ°μ μλ€.- μ΄μ κ°μ΄ μ κ·Ό μ νμ μ΄μ©νλ©΄ βμ΄ ν΄λμ€μλ μ΄ λ©μλλ₯Ό 보μ¬μ£Όμ§λ§ μ ν΄λμ€μλ λ³΄μ¬ μ£Όμ§ μλλ€βλ κ²μ νλ‘κ·Έλ¨μΌλ‘ ννν μ μλ€.
Memento
λ₯Ό λͺ κ° κ°μ§κΉ?
- λ°°μ΄ λ±μ μ¬μ©νλ©΄
Memento
μΈμ€ν΄μ€λ₯Ό μ¬λ¬ κ° κ°κ² νμ¬ λ€μν μμ μμμ μνλ₯Ό μ μ₯ν΄ λ μ μλ€.
Memento
μ μ ν¨κΈ°κ°μ?
- μμ νλ‘κ·Έλ¨μ²λΌ λ©λͺ¨λ¦¬μμλ§
Memento
λ₯Ό 보κ΄ν κ²½μ° ν° λ¬Έμ κ° μμ§λ§, νμΌλ‘ μμμ μΌλ‘ μ μ₯ν κ²½μ°μλMemento
μ μ ν¨κΈ°κ°μ΄ λ¬Έμ κ° λλ€. - νΉμ μμ μ
memento
λ₯Ό μ μ₯ν΄ λλλΌλ μ΄ν νλ‘κ·Έλ¨ λ²μ μ΄ μ¬λΌκ°λ©΄, νμΌλ‘ μ μ₯λμ΄ μλMemento
μ λ§μ§ μμ μ μλ€.
Caretaker
μν κ³Ό Originator
μν μ λλλ μ΄μ
- βμ€ν μ·¨μ κΈ°λ₯μ΄ νμνλ©΄
Originator
μμ κ·Έ κΈ°λ₯μ λ§λ€λ©΄ λ λμ§ μμκΉβνλ μλ¬Έμ κ°μ§ μ μλ€. Caretaker
λ μ΄λ μμ μ μ€λ μ·μ μ°μμ§ κ²°μ νκ³ , μΈμ μ€ν μ·¨μλ₯Ό ν μ§ κ²°μ νκ³ ,Memento
λ₯Ό μ μ₯νλ μΌμ νλ€.Originator
λMemento
λ₯Ό λ§λλ μΌκ³Ό μ£Όμ΄μ§Memento
λ₯Ό μ¬μ©νμ¬ μμ μ μνλ₯Ό 볡μνλ μΌμ νλ€.- μ΄μ²λΌ μν μ λΆλ΄νκ³ μκΈ° λλ¬Έμ λ€μκ³Ό κ°μ΄ μμ νκ³ μΆμ λμλ
Originator
λ₯Ό λ³κ²½ν νμκ° μ ν μλ€.
- μ¬λ¬ λ¨κ³μ μ€ν μ·¨μλ₯Ό ν μ μκ² λ³κ²½νκ³ μΆλ€.
- μ€ν μ·¨μ λΏλ§ μλλΌ, νμ¬ μνλ₯Ό νμΌμ μ μ₯νκ³ μΆλ€.
This post is licensed under CC BY 4.0 by the author.