[python] 메멘토 패턴

메멘토 패턴은 객체의 상태를 저장하고 복원하는 데 사용되는 패턴입니다. 이 패턴은 객체의 상태를 캡슐화하여, 상태를 중간 저장소에 저장하고 필요할 때 다시 복원할 수 있게 합니다.

메멘토 패턴은 주로 상태를 복원하기 위해 undo 또는 rollback 기능이 필요한 경우에 사용됩니다. 예를 들어, 텍스트 편집기에서 Undo를 누르면 이전 상태로 돌아갈 수 있습니다.

구성 요소

메멘토 패턴은 보통 세 가지 구성 요소로 이루어집니다:

  1. Originator (원조자): 상태를 저장하고 복원하는 역할을 담당합니다.
  2. Memento (메멘토): 원조자의 내부 상태를 담는 객체입니다.
  3. Caretaker (관리자): 메멘토를 보관하고 관리하는 역할을 담당합니다.

예제

다음은 Python에서 메멘토 패턴을 구현하는 간단한 예제입니다.

class Originator:
    def __init__(self):
        self.state = None
    
    def set_state(self, state):
        self.state = state
    
    def create_memento(self):
        return Memento(self.state)
    
    def restore_memento(self, memento):
        self.state = memento.get_state()

class Memento:
    def __init__(self, state):
        self.state = state
    
    def get_state(self):
        return self.state

class Caretaker:
    def __init__(self):
        self.mementos = []
    
    def add_memento(self, memento):
        self.mementos.append(memento)
    
    def get_memento(self, index):
        return self.mementos[index]

위의 예제에서 Originator는 상태를 저장하고 복원하는 원조자 역할을 합니다. Memento는 원조자의 상태를 담는 객체입니다. Caretaker는 메멘토를 보관하고 관리하는 역할을 합니다.

실제 사용 예시는 다음과 같습니다:

originator = Originator()
caretaker = Caretaker()

originator.set_state("상태 1")
caretaker.add_memento(originator.create_memento())

originator.set_state("상태 2")
caretaker.add_memento(originator.create_memento())

originator.set_state("상태 3")

print("현재 상태:", originator.state)  # 현재 상태: 상태 3

originator.restore_memento(caretaker.get_memento(1))

print("복원된 상태:", originator.state)  # 복원된 상태: 상태 2

위의 예제에서 Originator는 상태를 설정하고, Memento로 상태를 저장하고 복원합니다. CaretakerMemento를 관리하고 추적합니다. 상태를 복원할 때 Caretaker를 통해 원하는 메멘토를 가져와서 복원합니다.

요약

메멘토 패턴은 객체의 상태를 저장하고 복원하기 위한 패턴입니다. Originator, Memento, Caretaker로 구성되며, 원조자가 상태를 저장하고 복원하고, 메멘토는 상태를 담는 객체이고, 관리자는 메멘토를 관리합니다. 이 패턴은 주로 상태를 복원해야하는 상황에서 사용됩니다.