[swift] Command 디자인 패턴으로 기능 실행 취소/재실행 구현

Command 디자인 패턴은 기능을 객체로 캡슐화하여 요청을 처리하고, 실행취소, 재실행과 같은 추가 기능을 지원합니다.

Command 디자인 패턴 개요

Command 패턴은 명령을 객체로 만들어서 호출자와 수신자 사이의 의존성을 제거하기 위해 사용됩니다. 각 명령은 execute() 메서드를 호출하여 수신자의 상태를 변화시킵니다. 또한, 명령을 취소하거나 다시 실행할 수 있습니다.

구현 방법

Command 패턴을 사용하여 기능 실행 취소와 재실행을 구현하는 방법은 다음과 같습니다.

  1. Command 인터페이스 정의: execute() 메서드 및 undo() 메서드를 포함하는 Command 인터페이스를 정의합니다.

    protocol Command {
        func execute()
        func undo()
    }
    
  2. 실제 명령 클래스 구현: Command 인터페이스를 구현하는 클래스를 생성합니다.

    class ConcreteCommand: Command {
        private var receiver: Receiver
    
        init(receiver: Receiver) {
            self.receiver = receiver
        }
    
        func execute() {
            receiver.performAction() // 실행하는 동작
        }
    
        func undo() {
            receiver.undoAction() // 실행 취소하는 동작
        }
    }
    
  3. 요청자 및 수신자 클래스 생성: 명령을 발생시키는 요청자 및 명령을 수행하는 수신자 클래스를 정의합니다.

    class Invoker {
        private var command: Command
    
        func setCommand(_ command: Command) {
            self.command = command
        }
    
        func executeCommand() {
            command.execute()
        }
    
        func undoCommand() {
            command.undo()
        }
    }
    
    class Receiver {
        func performAction() {
            // 수신자의 동작 수행
        }
    
        func undoAction() {
            // 수신자의 동작 취소
        }
    }
    
  4. 실행 및 취소: 명령을 요청자에게 지정하고 실행하거나 취소할 수 있습니다.

    let receiver = Receiver()
    let command = ConcreteCommand(receiver: receiver)
    let invoker = Invoker()
    invoker.setCommand(command)
    
    invoker.executeCommand() // 실행
    invoker.undoCommand()    // 실행 취소
    

결론

Command 디자인 패턴을 사용하면 실행 취소 및 재실행을 간단하게 구현할 수 있습니다. 이로써 코드의 유연성과 유지보수성이 향상됩니다.

참조: Apple Developer Documentation - Command Pattern


참고자료