๋ฉ๋ฉํ ํจํด (Memento Pattern)
๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ์บก์ํํ์ฌ ์ ์ฅํ๊ณ , ๋์ค์ ํด๋น ์ํ๋ก ๋ณต์ํ ์ ์๊ฒ ํด์ฃผ๋ ํ์ ํจํด์
๋๋ค. ๊ฐ์ฒด์ ์ด์ ์ํ๋ฅผ ์ ์ฅํ๋ค๊ฐ ๋ณต๊ตฌํด์ผ ํ๋ ์ํฉ(์คํ ์ทจ์, ๋ณต๊ตฌ, ๋กค๋ฐฑ ๋ฑ)์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
์ฃผ์ ๋ชฉ์
โข
๊ฐ์ฒด์ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ ๊ธฐ๋ฅ ์ ๊ณต
โข
์บก์ํ๋ฅผ ์๋ฐํ์ง ์์ผ๋ฉด์ ๊ฐ์ฒด ์ํ ์ ์ฅ
โข
์คํ ์ทจ์(Undo) ๊ธฐ๋ฅ ๊ตฌํ์ ํ์ฉ
ํน์ง
โข
๊ตฌ์ฑ์์
โฆ
Originator: ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ ๊ฐ์ฒด
โฆ
Memento: ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด
โฆ
Caretaker: Memento๋ฅผ ๋ณด๊ดํ๊ณ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด
์์ ์ฝ๋
// Memento ํด๋์ค
class EditorMemento {
private final String content;
public EditorMemento(String content) {
this.content = content;
}
public String getContent() {
return content;
}
}
// Originator ํด๋์ค
class Editor {
private String content;
public void setContent(String content) {
this.content = content;
}
public EditorMemento save() {
return new EditorMemento(content);
}
public void restore(EditorMemento memento) {
content = memento.getContent();
}
}
// Caretaker ํด๋์ค
class History {
private List<EditorMemento> states = new ArrayList<>();
public void push(EditorMemento state) {
states.add(state);
}
public EditorMemento pop() {
return states.remove(states.size() - 1);
}
}
Java
๋ณต์ฌ
์ฝ๋ ์ค๋ช
์ ์์ ์ฝ๋๋ ํ
์คํธ ์๋ํฐ์ ์คํ ์ทจ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๊ฒ์
๋๋ค. ๊ฐ ํด๋์ค์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. EditorMemento ํด๋์ค (Memento)
โข
์๋ํฐ์ ์ํ(content)๋ฅผ ์ ์ฅํ๋ ๋ถ๋ณ ํด๋์ค์
๋๋ค.
โข
์์ฑ์๋ฅผ ํตํด ์ํ๋ฅผ ์ด๊ธฐํํ๊ณ , getter๋ฅผ ํตํด ์ํ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
2. Editor ํด๋์ค (Originator)
โข
์ค์ ์๋ํฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ํด๋์ค์
๋๋ค.
โข
ํ์ฌ ์ํ๋ฅผ Memento ๊ฐ์ฒด๋ก ์ ์ฅ(save)ํ๊ฑฐ๋ ๋ณต์(restore)ํ ์ ์์ต๋๋ค.
3. History ํด๋์ค (Caretaker)
โข
Memento ๊ฐ์ฒด๋ค์ ๊ด๋ฆฌํ๋ ํด๋์ค์
๋๋ค.
โข
List๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ค์ ์ ์ฅํ๊ณ , push์ pop ๋ฉ์๋๋ก ์ํ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
์ด ํจํด์ ์ฌ์ฉํ๋ฉด ์๋ํฐ์ ๋ด๋ถ ๊ตฌํ์ ๋
ธ์ถํ์ง ์์ผ๋ฉด์๋ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ ์ ์์ผ๋ฉฐ, ์คํ ์ทจ์ ๊ธฐ๋ฅ์ ๊น๋ํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
์ํ ํจํด vs ๋ฉ๋ฉํ ํจํด
ํน์ฑ | ์ํ ํจํด (State Pattern) | ๋ฉ๋ฉํ ํจํด (Memento Pattern) |
๋ชฉ์ | ๊ฐ์ฒด๊ฐ ์ํ์ ๋ฐ๋ผ ํ๋์ ๋ค๋ฅด๊ฒ ๋ง๋๋ ๊ฒ | ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ ๊ฒ |
๊ตฌ์ฑ ์์ | Context, State, ConcreteState | Memento, Originator, Caretaker |
์ํ ๊ด๋ฆฌ | ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ํ๋์ด ๋ฌ๋ผ์ง | ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋์ค์ ๋ณต์ ๊ฐ๋ฅ |
์ํ ๋ณํ | ์ํ๊ฐ ๋ณํ ๋๋ง๋ค ๋์์ด ๋ณํจ | ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ ๋ฐ ์ค์ ์ ๋ |
์ฌ์ฉ ์์ | ๊ฒ์ ์บ๋ฆญํฐ์ ์ํ(๊ณต๊ฒฉ, ๋ฐฉ์ด, ํด์ ๋ฑ) | ๋ฌธ์ ํธ์ง๊ธฐ์์ ์์
์ Undo/Redo,
๊ฒ์ ์ ์ฅ/๋ณต์ ๋ฑ |
๊ฒฐ๋ก
โข
์ํ ํจํด์ ์ํ์ ๋ฐ๋ฅธ ๋์ ๋ณํ์ ์ด์ ์ ๋ง์ถ๋ฉฐ, ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณํ ๋ ๊ทธ์ ๋ง๋ ๋์์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
โข
๋ฉ๋ฉํ ํจํด์ ๊ฐ์ฒด์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ๋ฉฐ, ์ด์ ์ํ๋ก ๋์๊ฐ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.