메멘토(Memento) 패턴

메멘토 패턴은 객체의 상태를 저장하고 복원하기 위해 사용되는 디자인 패턴입니다. 이 패턴은 객체의 상태를 캡슐화하고, 나중에 필요할 때 이 상태를 복원할 수 있는 방법을 제공합니다.

구성 요소

구현:

  1. 원조자 객체는 현재 상태를 저장하기 위해 메멘토 객체를 생성합니다.
  2. 원조자 객체는 메멘토 객체에 자신의 상태를 저장합니다.
  3. 원조자 객체는 메멘토 객체를 관리자에게 전달합니다.
  4. 관리자는 메멘토 객체를 보관하거나 필요한 경우에 복원을 위해 원조자에게 전달합니다.
  5. 필요한 시점에서 관리자는 메멘토 객체를 원조자에게 전달하여 상태를 복원합니다.

장점

단점

예시

홍팀과 청팀이 게임을 해서 점수를 기록한다. 만약 게임 판정이 잘못될 경우 이전 점수 기록으로 되돌려야한다.

Originator

public class Game implements Serializable {

    private int redTeamScore;

    private int blueTeamScore;

    public int getRedTeamScore() {
        return redTeamScore;
    }

    public void setRedTeamScore(int redTeamScore) {
        this.redTeamScore = redTeamScore;
    }

    public int getBlueTeamScore() {
        return blueTeamScore;
    }

    public void setBlueTeamScore(int blueTeamScore) {
        this.blueTeamScore = blueTeamScore;
    }

    public GameSave save() {
        return new GameSave(this.redTeamScore, this.blueTeamScore);
    }

    public void restore(GameSave save) {
        this.redTeamScore = save.getRedTeamScore();
        this.blueTeamScore = save.getBlueTeamScore();
    }
}

Memento

public final class GameSave {
    private final int redTeamScore;
    private final int blueTeamScore;

    public GameSave(int redTeamScore, int blueTeamScore) {
        this.redTeamScore = redTeamScore;
        this.blueTeamScore = blueTeamScore;
    }


    public int getRedTeamScore() {
        return redTeamScore;
    }

    public int getBlueTeamScore() {
        return blueTeamScore;
    }
}

Client

class GameTest {

    @Test
    public void game_restore_test() {
        Game game = new Game();
        game.setRedTeamScore(10);
        game.setBlueTeamScore(20);

        GameSave save = game.save();

        game.setRedTeamScore(31);
        game.setBlueTeamScore(21);

        game.restore(save);

        assertEquals(10, game.getRedTeamScore());
        assertEquals(20, game.getBlueTeamScore());

    }

}

결론

메멘토 패턴은 객체의 상태를 저장하고 복원하기 위한 유용한 디자인 패턴입니다. 이 패턴을 사용하면 객체의 상태를 캡슐화하여 외부에 노출시키지 않고 보호할 수 있으며, 필요한 경우에 상태를 복원할 수 있습니다. 또한, 관리자 객체를 통해 여러 상태를 관리하고 확장성을 확보할 수 있습니다.

하지만 메멘토 패턴을 사용할 때는 메모리 사용량과 성능에 대한 고려가 필요합니다. 상태의 크기가 크거나 저장과 복원 과정이 복잡한 경우에는 메모리 사용량이 증가하고 성능이 저하될 수 있습니다. 또한, 상태 노출 가능성과 관련된 보안 문제에 대해서도 주의가 필요합니다.

예제는 이곳 에서 확인하실수 있습니다.