2009년 11월 27일 금요일

MeMento Pattern

MeMento Pattern

: 상태저장하기
   – Undo(실행취소)
   – redo(재실행)
   – history(작업 이력의 작성)
   – snapshot(현재 상태의 저장)
인스턴스의 상태를 나타내는 역할을 도입해서 캡슐화의 파괴에 빠지지 않고 저장과 복원을 실행하는 것을 Memento 패턴

* 캡슐화파괴 : 인스턴스를 복원하기 위해서는 인스턴스 내부의 정보를 자유롭게 액세스할 수 있어야 합니다 그러나 원하지 않는 액세스를 허용하면 클래스 내부 구조에 의존한 코드가 프로그램의 여기저기로 흩어져 클래스의 수정을 어렵게 만듭니다. 이것을 캡슐화의 파고라고 합니다.

 

예제프로그램


 

등장인물

Originator(작성자)의 역할
  자신의 현재 상태를 저장하고 싶을 때 Memento 역할을 만듭니다. 또한, 이전의 Memento 역할을
  전달받으면 그 MeMento 역할을 만든 시점의 상태로 돌리는 처리를 실행합니다.
  예제프로그램에서 Gamer 클래스

Memento(기념품)의 역할
  Originator 역할의 내부 정보를 정리
  Memento역할은 Originator 역할의 내부 정보를 가지고 있지만, 그 정보를 누구에게도 공개하지
  않습니다.(C# 예제프로그램은 그냥 했음)

* Memento 역할은 다음 두 종류의 인터페이스를 가지고 있습니다.
  - wide interface -
    Memento 역할이 제공하는 넓은 인터페이스는 오브젝트의 상태를 원래의 상태로 돌리기 위해
    필요한 정보를 모두 얻을 수 있는 메소드의집합입니다. 넓은 인터페이스는 Memento 역할의 내부
    상태를 속속들이 들어내기 때문에 이것을 사용하는 것은 Originator 역할뿐입니다.
  - narrow interface -
    Memento 역할이 제공하는 좁은 인터페이스는 외부의 Caretaker 역할에 보여주는 것입니다. 좁은
    인터페이스로 할 수 있는 일에는 한계가 있고 내부 상태가 외부에 공개되는 것을 방지합니다.

  이 두 종류의 인터페이스를 구별해서 사용하면 오브젝트의 캡슐화가 파괴도는 것을 방지
  예제 프로그램에서는 Memento 클래스

Caretaker(관리인)의 역할
  현재 Originator의 역할의 상태를 저장하고 싶을 때, 그것을 Originator역할에게 전합니다. 그것을
  받아서 Memento 역할을 만들어 Caretaker 역할에게 전달합니다. Caretaker 역할은 미래의 필요에
  대비해서 그 Memento 역할을 저장해 둡니다. 예제프로그램에서는 Main 클래스



출처 : Java 언어로 배우는 디자인 패턴 입문

댓글 없음:

댓글 쓰기