[swift] 메멘토 패턴

메멘토 패턴은 보통 세 가지 객체로 구성됩니다:

  1. Originator: 메멘토를 생성하고 현재 상태를 저장하고 복원하기 위한 인터페이스를 제공하는 객체입니다.
  2. Memento: 메멘토의 상태를 저장하는 역할을 하는 객체입니다. 메멘토는 상태의 스냅샷을 캡쳐하여 Originator에게 돌려줍니다.
  3. Caretaker: 메멘토를 보관하고 관리하는 역할을 하는 객체입니다. 일반적으로는 Originator로부터 메멘토를 얻어와 작업을 수행한 뒤에, 필요 시에 복원하여 상태를 복구합니다.

메멘토 패턴은 보통 객체지향 소프트웨어 개발에서 사용되는데, 특히 상태를 저장하고 복원해야 하는 경우에 유용합니다. 예를 들어, 에디터 애플리케이션에서 ‘실행 취소’와 ‘다시 실행’ 기능을 제공하기 위해 메멘토 패턴을 사용할 수 있습니다.

이 패턴을 Swift로 구현해보겠습니다.

class Originator {
    private var state: String
    
    init(state: String) {
        self.state = state
    }
    
    func createState() -> Memento {
        return Memento(state: state)
    }
    
    func restoreState(memento: Memento) {
        state = memento.getState()
    }
}

class Memento {
    private let state: String
    
    init(state: String) {
        self.state = state
    }
    
    func getState() -> String {
        return state
    }
}

class Caretaker {
    private var mementos: [Memento] = []
    
    func addMemento(memento: Memento) {
        mementos.append(memento)
    }
    
    func getMemento(at index: Int) -> Memento {
        return mementos[index]
    }
}

여기서 Originator는 현재 상태를 저장하고 복원하기 위한 메소드들을 정의하고, Memento는 상태를 저장하는 역할을 하며, Caretaker는 Memento를 관리하고 필요시에 복원하는 역할을 합니다.

이와 같이 메멘토 패턴을 사용하면 객체의 상태를 효과적으로 저장하고 복원할 수 있으며, 상태 복원 과정을 캡슐화하여 유지보수성과 확장성을 향상시킬 수 있습니다.

[출처]