[Design pattern]메멘토 패턴

이번 메멘토 패턴의 주요 키워드는 '상태 저장 및 활용의 캡슐화' 입니다.






위가 그림판이라 생각하고 네모를 하나 그렸다고 칩시다.
이때 오른쪽으로 움직이고 싶습니다.

  옮기고 나니 드는 생각은 '그냥 원래자리가 낫네' 였습니다. 그래서 본능적으로
'ctrl+z'를 누릅니다.

 우리가 사용하는 거의 모든 문서, 그래픽 제작 및 수정 프로그램은 Undo를 지원합니다. 이게 당연하게 생각되는 시대인만큼 메멘토 패턴을 알면 상태 저장 및 활용에 도움이 될 수 있습니다.  영화 메멘토도 있는데 사전적인 의미로 '기억'입니다. 그냥 기억을 저장해서 ctrl+z눌러서 역연산을 하면 어떨까요? 물론 됩니다. 이 패턴은 그 기능 자체에 목적이 있는것이아니라 상태 저장 정보의 검색과 관리를 캡슐화하여 상태저장방식을 독립시키고 회복이나 저장에따른 영향이 본래의 오브젝트에 가지 않도록 하는 것이 목적입니다.



 이번엔 다이어그램이 좀 복잡합니다. 큰 개념을 설명하자면,
이동명령 클래스는 '관리 클래스',
도형 클래스는 '오리지널 클래스',
기억 클래스는 '메멘토 클래스'입니다.

각 클래스간의 관계와 역할은 이렇습니다.
'관리 클래스'가 '메멘토 클래스'를 관리합니다.
'메멘토 클래스'는 '오리지널 클래스'만 접근을 허용합니다.
'오리지널 클래스'는 '관리 클래스'의 명령을 받아 '메멘토 클래스'에 접근하는 형태입니다.
'관리 클래스'의 '메멘토 클래스' 접근 범위는 제한적이고, '오리지널 클래스'에게는 광범위 합니다.

간단이 이야기해서 관리자는 실제 명령수행 이전에 현상태의 저장을 지시하고, 사용자에게서 Undo명령이 들어오면 현재상태의 역상태를 만들고 기억을 예전상태로 돌립니다.지시는 관리자가 하고 실제 일은 도형이 다합니다. 기억클래스는 수동적이여서 자신이 자동으로 하는 일은 없고 시키는 것만 합니다. 이정도만 이해하면 위의 그림도 이해가 가실 것입니다.

사실 위 그림만 봐서는 메멘토 패턴이 뭐가 좋은지 잘 모를 수도 있습니다. 이걸 안쓴다면 어떻게 될지 생각해봅시다. 아마 도형클래스에서 상태정보를 저장하고 관리해야 할 것입니다. 도형클래스 본디 기능은 도형의 표현과 행동인데 상태까지 관리해야하니 클래스가 비대해지고 복잡해집니다. 그렇다고 관리 클래스가 떠앉자니 관리는 상태저장같은 부가적인 행동을 직접은 하기 싫어합니다.(관리(명령) 클래스는 자주 사용되므로 가벼울수록 좋습니다.)

하지만 상태저장 방법과 관리를 위한 클래스를 따로 둠으로써 두 클래스 모두 가벼워지고 부담도 덜게 되었습니다. 각자의 역할만 충실히 하면서 부가적인 상태저장을 기억클래스에 부탁하기만 하면 됩니다. 결국 디자인 패턴이 가리키는 방향은 역할의 구체적 분리입니다. 역할이 분리될 수록 부담도 덜면서 각자가 맡은 역할에 충실할 수 있습니다. 메멘토 패턴도 그의 일환입니다.

정리해봅시다.
메멘토 패턴은 상태 정보와 관리를 전담하면서 캡슐화되어 다른 클래스와 독립적으로 기능할 수 있습니다. 이 패턴을 쓰면 본래의 오리지널 객체는 상태를 저장해야하는 부담을 덜며 관리 클래스에서 메멘토 클래스에게 지시하므로 오리지널 클래스는 메멘토 클래스에 접근하는 몇가지 기능을 제외하고 본래의 기능에 충실 할 수 있습니다. 메멘토 클래스에 들어오는 상태정보가 너무 크다면 오버헤드가 많이 발생하므로 이 패턴이 적절치 않거나 상태정보의 간략화를 고려해봐야합니다.

출처 - http://newsdu.tistory.com/entry/GoF%EB%94%94%ED%8C%A8-18-%EB%A9%94%EB%A9%98%ED%86%A0Memento-%ED%8C%A8%ED%84%B4

댓글

가장 많이 본 글