1. Memento Pattern이란
Memento Pattern은 객체의 내부 상태를 저장하고 복원하기 위해 사용되는 행위 디자인 패턴입니다. 이는 객체의 상태를 미래에 이전 상태로 복원하기 위해 Memento 객체에 상태를 저장합니다.
2. Memento Pattern의 특징과 장점
Memento Pattern의 특징과 장점은 다음과 같습니다:
- 캡슐화 원칙을 침해하지 않고 객체의 내부 상태를 저장하고 복원할 수 있습니다.
- 객체의 이력 상태를 유연하게 관리하여 되돌리기 및 다시 실행 작업을 편리하게 수행할 수 있습니다.
- 상태를 외부에 저장함으로써 객체의 내부 상태를 노출시키지 않을 수 있습니다.
3. Memento Pattern의 실제 응용 예
Memento Pattern에는 많은 실제 응용 시나리오가 있으며, 그 중 일부 예는 다음과 같습니다:
- 텍스트 편집기에서의 되돌리기 및 다시 실행 기능은 각 작업의 상태를 저장하기 위해 Memento Pattern을 사용할 수 있습니다.
- 게임에서의 저장 및 불러오기 기능은 게임 진행 상황을 저장하기 위해 Memento Pattern을 사용할 수 있습니다.
- 이메일 클라이언트의 임시 저장 기능은 임시 이메일의 상태를 저장하기 위해 Memento Pattern을 사용할 수 있습니다.
4. Golang에서 Memento Pattern의 구현
4.1. UML 클래스 다이어그램
4.2. 예제 소개
UML 클래스 다이어그램을 기반으로 한 설명
이 예제에서는 내부 상태인 "state"를 가진 Originator 클래스가 있습니다. Originator는 SetState 메서드를 사용하여 상태를 설정하고 CreateMemento 메서드를 사용하여 memento 객체를 생성합니다. Memento 객체의 내부 상태는 Originator의 상태와 동일합니다. Caretaker 클래스는 memento 객체를 저장하고 AddMemento 메서드를 사용하여 memento를 추가하는 역할을 맡습니다.
구현 단계
- 내부 상태를 저장하기 위해 GetState 메서드를 가진 Memento 객체를 생성합니다.
- 상태를 설정하고 memento를 생성하기 위한 메서드를 가진 Originator 객체를 생성합니다.
- memento 객체를 저장하는 역할을 맡은 Caretaker 객체를 생성합니다.
- Originator에서 상태를 생성하고 복원하기 위한 메서드를 구현합니다:
- memento 객체를 생성할 때, Originator의 상태를 memento에 저장합니다.
- 상태를 복원할 때, memento에서 상태를 Originator에 복원합니다.
- memento를 추가하고 가져오기 위한 메서드를 구현합니다:
- memento를 저장하기 위해 add memento 메서드를 사용합니다.
- memento를 가져오기 위해 get memento 메서드를 사용합니다.
4.3.1. Memento 객체 생성
type Memento struct {
state string
}
func (m *Memento) GetState() string {
return m.state
}
4.3.2. Memento에 상태 저장하기
type Originator struct {
state string
}
func (o *Originator) SetState(state string) {
o.state = state
}
func (o *Originator) CreateMemento() *Memento {
return &Memento{state: o.state}
}
4.3.3. Memento에서 상태 복원하기
func (o *Originator) SetMemento(memento *Memento) {
o.state = memento.GetState()
}
4.3.4. 되돌리기 작업에 Memento Pattern 사용하기
type Caretaker struct {
mementos []*Memento
}
func (c *Caretaker) AddMemento(m *Memento) {
c.mementos = append(c.mementos, m)
}
func (c *Caretaker) GetMemento(index int) *Memento {
return c.mementos[index]
}
4.3.5. 다시 실행 작업을 위한 메멘토 패턴 사용
func main() {
originator := &Originator{}
caretaker := &Caretaker{}
originator.SetState("상태 1")
caretaker.AddMemento(originator.CreateMemento())
originator.SetState("상태 2")
caretaker.AddMemento(originator.CreateMemento())
originator.SetMemento(caretaker.GetMemento(0))
fmt.Println("상태 1로 복원한 후의 원조 상태:", originator.state)
originator.SetMemento(caretaker.GetMemento(1))
fmt.Println("상태 2로 복원한 후의 원조 상태:", originator.state)
}