본문 바로가기
DesignPattern

[Design Pattern] Memento Pattern

by 봄석 2019. 10. 17.

[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

 

qjatjr1108/DesignPattern

DesignPattern Sample. Contribute to qjatjr1108/DesignPattern development by creating an account on GitHub.

github.com

 

'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

댓글