Post

⛓️ Java Design-Pattern Xβ…¨ - Memento

⛓️ Java Design-Pattern Xβ…¨ - Memento

πŸ“— γ€ŽJAVA μ–Έμ–΄λ‘œ λ°°μš°λŠ” λ””μžμΈ νŒ¨ν„΄ : μ‰½κ²Œ λ°°μš°λŠ” GoF의 23κ°€μ§€ λ””μžμΈ νŒ¨ν„΄γ€λ₯Ό 읽고 μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.

Memento νŒ¨ν„΄μ΄λž€?

  • κ°€λ Ή ν…μŠ€νŠΈ 에디터λ₯Ό μ‚¬μš©ν•  λ•Œ μ‹€μˆ˜λ‘œ ν•„μš”ν•œ ν…μŠ€νŠΈλ₯Ό μ‚­μ œν•˜λ”λΌλ„ μ‹€ν–‰ μ·¨μ†Œ κΈ°λŠ₯을 톡해 μ‚­μ œν•˜κΈ° μ „ μƒνƒœλ‘œ ν…μŠ€νŠΈλ₯Ό 볡원할 수 μžˆλ‹€.
  • 객체지ν–₯ ν”„λ‘œκ·Έλž¨μœΌλ‘œ μ‹€ν–‰ μ·¨μ†Œλ₯Ό κ΅¬ν˜„ν•˜λ €λ©΄ μΈμŠ€ν„΄μŠ€κ°€ κ°€μ§„ 정보λ₯Ό μ €μž₯ν•΄ 두어야 ν•œλ‹€.
  • μΈμŠ€ν„΄μŠ€λ₯Ό λ³΅μ›ν•˜κΈ° μœ„ν•΄μ„œλŠ” μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€ 정보에 자유둭게 μ ‘κ·Όν•  수 μžˆμ–΄μ•Ό ν•˜λŠ”λ°, λΆ€μ£Όμ˜ν•˜κ²Œ 접근을 ν—ˆλ½ν•΄ 버리면, ν•΄λ‹Ή 클래슀의 λ‚΄λΆ€ ꡬ쑰에 μ˜μ‘΄ν•˜λŠ” μ½”λ“œκ°€ ν”„λ‘œκ·Έλž¨ 곳곳에 흩어져 클래슀λ₯Ό μˆ˜μ •ν•˜κΈ° κ³€λž€ν•΄μ§€κ³ , 이λ₯Ό μΊ‘μŠν™”μ˜ 파괴라고 ν•œλ‹€.
  • μΈμŠ€ν„΄μŠ€μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” 역할을 λ„μž…ν•΄, μΊ‘μŠν™”μ˜ νŒŒκ΄΄μ— λΉ μ§€μ§€ μ•Šκ³  μ €μž₯κ³Ό 볡원을 ν•˜λŠ” 것이 Memento νŒ¨ν„΄μ΄λ‹€.
  • Memento νŒ¨ν„΄μ„ μ΄μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 일을 μˆ˜ν–‰ν•  수 μžˆλ‹€.
  1. μ‹€ν–‰ μ·¨μ†Œ(Undo)
  2. λ‹€μ‹œ μ‹€ν–‰(Redo)
  3. μž‘μ—… 이λ ₯ μž‘μ„±(History)
  4. ν˜„μž¬ μƒνƒœ μ €μž₯(Snapshot)

예제 ν”„λ‘œκ·Έλž¨

  • λ‹€μŒμ€ β€˜κ³ΌμΌ λͺ¨μœΌκΈ° μ£Όμ‚¬μœ„ κ²Œμž„β€™μ„ 주제둜 ν•œ 예제 ν”„λ‘œκ·Έλž¨μ΄λ‹€.
  • κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™λ‹€.
  1. 이 κ²Œμž„μ€ μžλ™μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.
  2. κ²Œμž„ 주인곡이 μ£Όμ‚¬μœ„λ₯Ό λ˜μ Έμ„œ λ‚˜μ˜¨ μˆ˜κ°€ λ‹€μŒ μƒνƒœλ₯Ό κ²°μ •ν•©λ‹ˆλ‹€.
  3. 쒋은 μˆ˜κ°€ λ‚˜μ˜€λ©΄ 주인곡의 돈이 λŠ˜μ–΄λ‚©λ‹ˆλ‹€.
  4. λ‚˜μœ μˆ˜κ°€ λ‚˜μ˜€λ©΄ 돈이 μ€„μ–΄λ“­λ‹ˆλ‹€.
  5. 특히 쒋은 μˆ˜κ°€ λ‚˜μ˜€λ©΄ 주인곡은 과일을 λ°›μŠ΅λ‹ˆλ‹€.
  6. 돈이 μ—†μ–΄μ§€λ©΄ μ’…λ£Œν•©λ‹ˆλ‹€.
  • ν”„λ‘œκ·Έλž¨ μ•ˆμ—μ„œλŠ” 돈이 λͺ¨μ˜€μ„ λ•Œ 미래λ₯Ό μœ„ν•΄ 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λŠ” λ‹€μŒκ³Ό 같은 두 μ’…λ₯˜μ˜ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°–κ³  μžˆλ‹€.
  1. wide interface ... 넓은 μΈν„°νŽ˜μ΄μŠ€
    • 였브젝트의 μƒνƒœλ₯Ό λ˜λŒλ¦¬λŠ” 데 ν•„μš”ν•œ 정보λ₯Ό λͺ¨λ‘ 얻을 수 μžˆλŠ” λ©”μ„œλ“œ μ§‘ν•©
    • 넓은 μΈν„°νŽ˜μ΄μŠ€λŠ” Memento의 λ‚΄λΆ€ μƒνƒœλ₯Ό λ“œλŸ¬λ‚΄κΈ° λ•Œλ¬Έμ— 이λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 것은 Originator 뿐이닀.
  2. 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λ₯Ό λ³€κ²½ν•  ν•„μš”κ°€ μ „ν˜€ μ—†λ‹€.
  1. μ—¬λŸ¬ λ‹¨κ³„μ˜ μ‹€ν–‰ μ·¨μ†Œλ₯Ό ν•  수 있게 λ³€κ²½ν•˜κ³  μ‹Άλ‹€.
  2. μ‹€ν–‰ μ·¨μ†Œ 뿐만 μ•„λ‹ˆλΌ, ν˜„μž¬ μƒνƒœλ₯Ό νŒŒμΌμ— μ €μž₯ν•˜κ³  μ‹Άλ‹€.
This post is licensed under CC BY 4.0 by the author.