Memento 패턴

5.디자인패턴 2016. 9. 13. 20:50

Memento 패턴은 특정 시점에 객체의 상태를 저장하고 복원하기 위해서 사용하는 패턴이다. 바둑이나 오목과 같이 일련의 진행 사항을 저장해 두었다가 다시 복구하기 위해서 사용할 수도 있고, 실패가 예상되는 작업이 있을 경우 복원 지점을 저장해 두었다가 실패했을 때 원 상태로 복원하기 위해서 사용할 수도 있다.


Memento 패턴 클래스 다이어그램

이 다이어그램은 User 클래스와 Memento 클래스의 관계를 표현한다. User 클래스는 id와 level, exp와 같은 필드들을 가진다. Memento 클래스는 User 클래스가 가진 필드들을 저장하는 역할을 한다. 따라서 User가 가지고 있는 모든 필드들을 가지고 있어야 한다. User 클래스는 다이어그램에서 save와 load 메소드를 제공하도록 되어 있다. 원래 Memento 패턴에서는 User 클래스의 데이터 저장과 복원을 별도로 관리하는 클래스를 두기도 하는데 이렇게 하는 경우 생각보다 구현이 복잡해 질 수 있다. 따라서 이 예제에서는 간단히 User 클래스 스스로가 저장과 복원을 관리하도록 하였다.

세부적인 구현은 아래 코드를 보고 이야기 하도록 하자.


Memento 패턴의 구현

class User

{

    private String id;

    private int level;

    private int exp;

  

    // 객체의 상태를 저장하기 위해 꼭 필요한 항목을 캡슐화

    class Memento

    {

        private String id;

        private int level;

        private int exp;

        public Memento(User user){

            id = user.id;

            level = user.level;

            exp = user.exp;

        }

    };

    Vector<Memento> backup = new Vector<>();

    public int save()

    {

        backup.add(new Memento(this));

        return backup.size() - 1;

    }

    public void load(int token)

    {

        Memento m = backup.get(token);

        id = m.id;

        level = m.level;

        exp = m.exp;

    }

}

특징적인 부분을 이야기해 보면, 우선 Memento 클래스가 User 클래스 내부에 선언되어 있다. 이것은 클래스가 단순할 경우 특히 유용한데, 다수의 Memento 패턴이 사용되어야 할 경우라면 Memento 클래스를 내부 클래스로 선언하는 편이 좋다. 

save와 load를 구현하기 위해서는 Memento 객체를 생성하여 저장해 둘 backup 리스트를 선언해 주어야 한다. save() 메소드에서는 새로운 Memento 객체를 생성하고, User 객체가 자기 자신을 인자로 넘겨 Memento 객체가 초기화 되도록 한다. 그리고 backup 리스트에 저장하여 복원에 대비한다. load() 메소드에서는 backup 리스트의 인덱스를 받아 Memento 객체를 꺼내고, 이 Memento 객체에 저장된 필드 값들을 User 객체의 필드 값으로 바꿔준다. 이를 통해 이전에 저장된 데이터를 복원할 수 있다.

이 구현 방식은 Memento 패턴의 간략화 된 버전이라 할 수 있다. 이 Memento 패턴의 save() load() 메소드를 이용하여 undo()나 redo()와 같은 기능들도 구현할 수 있다.

'5.디자인패턴' 카테고리의 다른 글

Abstract Factory 패턴  (0) 2016.09.16
Factory Method 패턴  (4) 2016.09.16
Bridge 패턴  (0) 2016.09.13
Template Method 패턴  (0) 2016.09.10
Singleton 패턴  (0) 2016.09.10
Posted by 이세영2
,