아무거나

[Design Pattern] Memento Pattern 본문

Java & Kotlin/Java

[Design Pattern] Memento Pattern

전봉근 2020. 1. 12. 02:00
반응형

메멘토 패턴(Memento Pattern)

객체의 상태를 Memento 라고 불리는 객체에 저장했다가, 다시 꺼내서 객체의 상태를 이전의 상태로 되돌리는 패턴

 

 

  • Originator: 상태값을 가지고 있는 객체
  • Memento: Originator의 상태를 저장하고 있는 객체
  • CareTaker: Memento를 관리해주는 관리자 역할을 함

메멘토 패턴 예시 - 1

먼저 abc라는 패키지를 생성하고 그 패키지 안에 Originator 클래스를 생성
[Originator.java]

package com.bkjeon.memento.abc;

public class Originator {

    String state;

    public Memento createMemento() {
        return new Memento(state);
    }

    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

}

Memento 클래스 작성
[Memento.java]

package com.bkjeon.memento.abc;

public class Memento {

    String state;

    public Memento(String state) {
        this.state = state;
    }

    public String getState() {
        return this.state;
    }

}

메인클래스 작성
[Main.java]

package com.bkjeon.memento;

import com.bkjeon.memento.abc.Memento;
import com.bkjeon.memento.abc.Originator;

import java.util.Stack;

public class Main {

    public static void main(String[] args) {
        Stack<Memento> mementos = new Stack<>();    // CareTaker
        Originator originator = new Originator();

        originator.setState("state 1");
        mementos.push(originator.createMemento());
        originator.setState("state 2");
        mementos.push(originator.createMemento());
        originator.setState("state 3");
        mementos.push(originator.createMemento());
        originator.setState("state Final");
        mementos.push(originator.createMemento());

        // CareTaker에 저장했다가 꺼냈을 때
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());
        originator.restoreMemento(mementos.pop());
        System.out.println(originator.getState());
    }

}

실행결과

state Final
state 3
state 2
state 1

메멘토 패턴 예시 - 1에 protected 적용

누가 실수나 악의적으로 아래와 같이 코드를 작성했다고 하자.

...
Memento memento = originator.createMemento();
memento = new Memento("state somthing");
mementos.push(memento);
...

이렇게 외부에서 Memento를 바꿀 수 있으면 굉장히 위험해질 수 있으므로 protected로 변경하자.
[Memento.java]

package com.bkjeon.memento.abc;

public class Memento {

    String state;

    protected Memento(String state) {
        this.state = state;
    }

    protected String getState() {
        return this.state;
    }

}

이렇게 protected로 선언하면 위의 악의적으로 작성한 코드에 에러표시가 나고 또한 아래와 같은 코드에서도 에러가 표시된다. protected는 자기가 상속받을 객체나 패키지 내에서만 접근이 가능하다.

 

 

참고: https://www.inflearn.com/course/%EC%9E%90%EB%B0%94-%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

 

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

[Design Pattern] Proxy Pattern  (0) 2020.01.12
[Design Pattern] Flyweight Pattern  (0) 2020.01.12
[Design Pattern] State Pattern  (0) 2020.01.10
[Design Pattern] Mediator Pattern  (0) 2020.01.08
[Design Pattern] Observer Pattern  (0) 2020.01.05
Comments