[Design Pattern] Memento Pattern
이번에는 메멘토 패턴에 대하여 알아보고
예제도 봐보도록 하겠습니다.
Memento Pattern이란??
메멘토 패턴은 객체의 상태 정보를 저장하고 사용자의 필요에
의하여 원하는 시점의 데이터를 복원할 수 있는 패턴입니다.
Memento Pattern 특징
Memento Pattern은 3개의 액터 클래스를 사용합니다.
메멘토에는 복원할 개체의 상태가 포함됩니다.
- Originator : 현재 State를 가지고, Memento 객체와 Memento 객체 상태를 얻게 합니다.
- Memento : State를 가지고 있는 인스턴스입니다.
- CareTaker : Memento를 순서대로 저장합니다.
Memento Pattern with Java
public class Memento {
private String state;
public Memento(String state){
this.state = state;
}
public String getState(){
return state;
}
}
public class Originator {
private String state;
public void setState(String state){
this.state = state;
}
public String getState(){
return state;
}
public Memento saveStateToMemento(){
return new Memento(state);
}
public void getStateFromMemento(Memento memento){
state = memento.getState();
}
}
public class CareTaker {
private List<Memento> mementoList = new ArrayList<Memento>();
public void add(Memento state){
mementoList.add(state);
}
public Memento get(int index){
return mementoList.get(index);
}
}
public class MementoPatternDemo {
public static void main(String[] args) {
Originator originator = new Originator();
CareTaker careTaker = new CareTaker();
originator.setState("State #1");
originator.setState("State #2");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #3");
careTaker.add(originator.saveStateToMemento());
originator.setState("State #4");
System.out.println("Current State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(0));
System.out.println("First saved State: " + originator.getState());
originator.getStateFromMemento(careTaker.get(1));
System.out.println("Second saved State: " + originator.getState());
}
}
//result
Current State: State #4
First saved State: State #2
Second saved State: State #3
위 예제에서 Memento 클래스는 state를 가지고 있습니다.
Originator는 Memento 인스턴스를 생성하고 또다시 또 그 객체를 반환하는 역할을 합니다.
Craker는 Memento객체를 List에 순서대로 save 합니다.
Memento Pattern with Kotlin
data class Memento(val state: String)
class Originator(var state: String) {
fun createMemento(): Memento {
return Memento(state)
}
fun restore(memento: Memento) {
state = memento.state
}
}
class CareTaker {
private val mementoList = ArrayList<Memento>()
fun saveState(state: Memento) {
mementoList.add(state)
}
fun restore(index: Int): Memento {
return mementoList[index]
}
}
class MementoTest {
@Test
fun `MementoTest`() {
val originator = Originator("initial state")
val careTaker = CareTaker()
careTaker.saveState(originator.createMemento())
originator.state = "State #1"
originator.state = "State #2"
careTaker.saveState(originator.createMemento())
originator.state = "State #3"
println("Current State: " + originator.state)
Assert.assertThat(originator.state, CoreMatchers.equalTo("State #3"))
originator.restore(careTaker.restore(1))
println("Second saved state: " + originator.state)
Assert.assertThat(originator.state, CoreMatchers.equalTo("State #2"))
originator.restore(careTaker.restore(0))
println("First saved state: " + originator.state)
Assert.assertThat(originator.state, CoreMatchers.equalTo("initial state"))
}
}
//result
Current State: State #3
Second saved state: State #2
First saved state: initial state
정리
메멘토 패턴(memento pattern)은 객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 패턴입니다.
샘플 보러 가기
https://github.com/qjatjr1108/DesignPattern
'DesignPattern' 카테고리의 다른 글
[Design Pattern] Iterator Pattern (0) | 2019.10.18 |
---|---|
[Design Pattern] Mediator Pattern (0) | 2019.10.18 |
[Design Pattern] Observer Pattern (0) | 2019.10.15 |
[Design Pattern] Strategy Pattern (4) | 2019.10.11 |
[Design Pattern] Flyweight pattern (4) | 2019.10.10 |
댓글