커맨드 (Command) 디자인패턴

커맨드(Command) 패턴은 요청을 객체의 형태로 캡슐화하여, 실행할 연산을 나중에 지정하거나 연산의 취소 가능한 작업을 지원하는 패턴입니다. 이 패턴은 실행될 연산을 나중에 지정할 수 있도록 해주며, 요청을 취소하거나 다시 실행할 수 있는 기능을 제공합니다.

커맨드 패턴을 예제와 함께 설명해보겠습니다. 예를 들어, iOS 애플리케이션에서 텍스트 뷰에 대한 다양한 편집 기능을 구현한다고 가정해봅시다. 이때 편집 기능을 객체로 캡슐화하여, 실행할 연산을 지정하거나 실행 취소를 할 수 있도록 커맨드 패턴을 적용해보겠습니다.

다음은 커맨드 패턴을 사용하여 텍스트 뷰에 대한 다양한 편집 기능을 구현한 예제 코드입니다.

// 커맨드 프로토콜
protocol Command {
    func execute()
    func undo()
}

// 커맨드를 캡슐화하는 클래스
class CommandManager {
    var commands: [Command] = []

    func executeCommand(command: Command) {
        commands.append(command)
        command.execute()
    }

    func undoCommand() {
        if let lastCommand = commands.last {
            lastCommand.undo()
            commands.removeLast()
        }
    }
}

// 텍스트 뷰 편집 커맨드
class TextCommand: Command {
    let textView: UITextView
    let text: String
    var previousText: String = ""

    init(textView: UITextView, text: String) {
        self.textView = textView
        self.text = text
    }

    func execute() {
        previousText = textView.text
        textView.text += text
    }

    func undo() {
        textView.text = previousText
    }
}

// 사용 예제
let textView = UITextView()
let commandManager = CommandManager()

let addTextCommand = TextCommand(textView: textView, text: "Hello, ")
commandManager.executeCommand(command: addTextCommand)

let addMoreTextCommand = TextCommand(textView: textView, text: "world!")
commandManager.executeCommand(command: addMoreTextCommand)

print(textView.text)    // "Hello, world!"

commandManager.undoCommand()
print(textView.text)    // "Hello, "

위의 예제에서는 Command 프로토콜을 정의하고, CommandManager 클래스를 구현합니다. TextCommand 클래스는 Command 프로토콜을 구현하여, 텍스트 뷰의 편집 기능을 구현합니다. CommandManager 클래스는 커맨드 객체를 캡슐화하며, 커맨드를 실행하거나 실행 취소할 수 있는 기능을 제공합니다.

커맨드 패턴은 객체의 요청을 캡슐화하여 실행할 연산을 나중에 지정할 수 있도록 해주는 디자인 패턴입니다. 이 패턴을 사용하면, 실행될 연산을 나중에 지정할 수 있기 때문에, 요청의 발신자와 수신자 간의 결합도를 낮출 수 있습니다. 또한, 실행 취소 기능을 지원하므로, 트랜잭션과 같은 기능을 구현할 수 있습니다.

위의 예제에서는 TextCommand 클래스가 Command 프로토콜을 구현하여, 텍스트 뷰의 편집 기능을 구현합니다. TextCommand 클래스는 실행할 연산을 캡슐화하고, 실행 취소 기능을 지원합니다. CommandManager 클래스는 Command 프로토콜을 준수하는 커맨드 객체를 캡슐화하며, executeCommand 메서드와 undoCommand 메서드를 제공하여, 커맨드를 실행하거나 실행 취소할 수 있는 기능을 제공합니다.

커맨드 패턴은 iOS 애플리케이션에서도 다양한 곳에서 사용됩니다. 예를 들어, 사용자 인터페이스에서 이벤트를 처리하는 경우, 이벤트를 커맨드 객체로 캡슐화하여 나중에 실행할 수 있습니다. 또한, 데이터베이스 트랜잭션을 구현할 때도 커맨드 패턴을 사용할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다