๋ฐ์ํ
Memento Pattern
Memento ํจํด์ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ ์ ์๊ฒ ํ๋ ๋์์ธ ํจํด์ ๋๋ค.
- ์ด ํจํด์ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ์บก์ํํ์ฌ ์ธ๋ถ์ ๋ ธ์ถ์ํค์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ ์ ์๊ฒ ํด์ค๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๋ค Object์ ํ์คํ ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ถ์ ๋ ์ ์ฉํ ํจํด์ ๋๋ค. → ๊ฒ์์์ Saveํ๋ ๊ฒ์ ๋ ์ฌ๋ฆฌ๋ฉด ๋ฉ๋๋ค.
- ๊ฐ๋ น ํ ์คํธ ์๋ํฐ ์ฌ์ฉํ ๋ undo์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ญ์ ํ๊ธฐ ์ ์ํ๋ก ํ ์คํธ ๋ณต์์ด ๊ฐ๋ฅํ๊ณ , ๊ทธ ๊ธฐ๋ฅ์ ๋ช ๋จ๊ณ๋ก ์คํํด์ ํธ์ง์์ ์ ์ ์ ๊ณผ๊ฑฐ๋ก ๋๋ฆฌ๋ ๊ฒ๋ ๊ฐ๋ฅํจ
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋จ์์ undo๊ธฐ๋ฅ์ ์คํํ๋ ค๋ฉด ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ฅผ ์ ์ฅํด ๋ ํ์๊ฐ ์์ต๋๋ค.
- ๋จ, ์ ์ฅ๋ง ํด์๋ ์๋๊ณ , ์ ์ฅํ ์ ๋ณด๋ก๋ถํฐ ์ธ์คํด์ค๋ฅผ ์๋๋๋ก ๋๋๋ฆด ์ ์์ด์ผ ํฉ๋๋ค.
- Mememto Pattern์ ์ฌ์ฉํ๋ฉด ์ด๋ค ์์ ์ ์ธ์คํด์ค์ ์ํ๋ฅผ ํ์คํ๊ฒ ๊ธฐ๋กํด์ ์ ์ฅํด ๋๋ฉด ๋์ค์ ์ธ์คํด์ค๋ฅผ ๊ทธ ์์ ์ ์ํ ๋๋๋ฆด ์ ์์ต๋๋ค.
- Originator: ์์ฑ์ ์ญํ , ์์ ์ ํ์ฌ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์ถ์ ๋ Memento๋ฅผ ๋ง๋ค์ด ์ ์ฅํ๊ณ ๋ถ๋ฌ์ค๊ธฐ๋ ํจ
- Memento: Originator ์ญํ ์ ๋ด๋ถ ์ ๋ณด๋ฅผ ์ ๋ฆฌ ๋ณด๊ดํฉ๋๋ค.
- Caretaker: ๋ฏธ๋์ ํ์์ ๋๋นํ์ฌ Memento ์ญํ ์ ์ ์ฅํฉ๋๋ค.
Object
- Object๋ฅผ ๋ํ๋ด๋ State๊ฐ ์กด์ฌํฉ๋๋ค. (Memento์ ๋ค์ด๊ฐ์ผ ํ ๋ด์ฉ)
- createMemento(): State์ ๋ํ memento๋ฅผ ๋ง๋ค์ด ์ฃผ๋ ํจ์์ ๋๋ค.
- restore(): Memento Object๋ก๋ถํฐ State๋ฅผ ๋ณต์ํด ์ฃผ๋ ํจ์์ ๋๋ค.
Memento
- Object์ stae๋ฅผ ๊ทธ๋๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ Object์ ๋์ผํ state๋ฅผ property๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- Memento๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ ๋ณด๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
Memento Pattern Example
class Cat:
def __init__(self, age, height):
self.age = age
self.height = height
def speak(self):
print(f'{self.age} year old, {self.height} cm, meow')
def createMemento(self):
cat_memento = CatMemento(self.age, self.height)
return cat_memento
def restore(self, memento):
self.age = memento.age
self.height = memento.height
- Cat ํด๋์ค
- __init__: ๋ด๋ถ ์ํ๋ก age์ height๋ฅผ ๊ฐ์ง๋๋ค.
- speak(): ํ์ฌ age์ height๋ฅผ ์ถ๋ ฅํ๋ ํจ์์ ๋๋ค.
- createMemento(): ํ์ฌ Cat์ ์ํ๋ฅผ Memento ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๋ฐํํ๋ ํจ์์ ๋๋ค.
- restore(): ์ ๋ฌ๋ฐ์ Memento ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ Cat์ ์ํ๋ฅผ ๋ณต์ํ๋ ํจ์์ ๋๋ค.
import uuid
from datetime import datetime
class CatMemento:
def __init__(self, age, height):
self.uuid = uuid.uuid4()
self.created_time = datetime.now()
self.age = age
self.height = height
- CatMemento ํด๋์ค
- __init__: Memento ๊ฐ์ฒด๋ก Cat์ age์ height๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ํ, ์์ฑ ์๊ฐ(created_time)๊ณผ ๊ณ ์ ID(uuid)๋ฅผ ๋ถ์ฌํฉ๋๋ค.
cat_history = []
- cat_history: Memento ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๋ฆฌ์คํธ์ ๋๋ค.
cat = Cat(0, 10)
cat_history.append(cat.createMemento())
- Cat ๊ฐ์ฒด ์์ฑ: age=0, height=10์ธ Cat ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- Cat์ state๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํด createMememto()๋ฅผ ํตํด Memento๋ฅผ ์์ฑ, cat_hisotry
cat.age = 1
cat.height = 25
cat_history.append(cat.createMemento())
- Age=1, height=25๊ฐ ๋ ์ํ์์ ๋ณด๊ฒ ์ต๋๋ค.
- ์ด ์ ๋ณด๋ฅผ cat_history์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด createMemento()๋ฅผ ํตํด Memento๋ฅผ ์์ฑํด์ ๋ฆฌ์คํธ์ ์ถ๊ฐํฉ๋๋ค.
cat.age = 2
cat.height = 50
cat_history.append(cat.createMemento())
- Age=2, height=50๊ฐ ๋ ์ํ์์ ๋ณด๊ฒ ์ต๋๋ค.
- ์ด ์ ๋ณด๋ฅผ cat_history์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด createMemento()๋ฅผ ํตํด Memento๋ฅผ ์์ฑํด์ ๋ฆฌ์คํธ์ ์ถ๊ฐํฉ๋๋ค.
cat.restore(cat_history[0])
- cat_history์ 0๋ฒ์งธ ๊ณผ๊ฑฐ ์ ๋ณด๋ก ๋ณต๊ตฌํ๊ณ ์ถ๋ค๋ฉด restore()์ ํธ์ถํ์ฌ ๊ทธ argument๋ก cat_history์ 0๋ฒ์งธ memento Object๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋ฉ๋๋ค.
cat.speak() -> # 0year old, 10cm, meow
- Cat์ speak() ํธ์ถํ๋ฉด 0๋ฒ์จฐ memento๋ก state ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
Object์ state๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํด Memento ์ค๋ธ์ ํธ ์์ฑํ๊ณ ๊ทธ ์ค๋ธ์ ํธ๋ค์ ํ์คํ ๋ฆฌ ๋ฆฌ์คํธ์์ ๊ด๋ฆฌํ๋ Pattern ์ ๋๋ค.
๋ฐ์ํ
'๐บ๏ธ Design Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Design Pattern] Visitor Pattern - ๋ฐฉ๋ฌธ์ ํจํด (0) | 2024.06.10 |
---|---|
[Design Pattern] Observer Pattern - ์ต์ ๋ฒ ํจํด (0) | 2024.06.09 |
[Design Pattern] Chain of Responsibility (0) | 2024.06.09 |
[Design Pattern] Command Pattern - ์ปค๋งจ๋ ํจํด (0) | 2024.06.09 |
[Design Pattern] Strategy Pattern - ์ ๋ต ํจํด (0) | 2024.06.08 |