[swift] Command 디자인 패턴

Command 디자인 패턴은 객체 지향 소프트웨어 디자인 패턴 중 하나로, 명령을 객체로 캡슐화하여 매개변수화하고, 메서드 호출, 요청 또는 이벤트 처리를 요청하는 객체를 만드는 패턴입니다. Command 패턴은 요청을 객체로 변환하는 방식으로 요청을 매개변수화합니다. 이는 요청에 따라 다양한 메서드를 호출할 수 있도록 합니다.

Command 패턴의 가장 일반적인 사용 사례는 동작을 요청, 큐잉 또는 로깅 하는 것입니다. 예를 들어 리모컨의 버튼을 눌렀을 때 전원을 켜거나 끄는 동작을 메서드로 만들어 캡슐화하고, 이를 실행하는 기능을 만들 때 Command 패턴을 사용할 수 있습니다.

Command 디자인 패턴 사용 예시

아래는 Swift에서 Command 패턴을 사용한 간단한 예시 코드입니다.

// Command 인터페이스
protocol Command {
    func execute()
}

// Receiver
class Light {
    func turnOn() {
        print("전원이 켜졌습니다.")
    }
    
    func turnOff() {
        print("전원이 꺼졌습니다.")
    }
}

// ConcreteCommand
class TurnOnLightCommand: Command {
    let light: Light
    
    init(light: Light) {
        self.light = light
    }
    
    func execute() {
        light.turnOn()
    }
}

class TurnOffLightCommand: Command {
    let light: Light
    
    init(light: Light) {
        self.light = light
    }
    
    func execute() {
        light.turnOff()
    }
}

// Invoker
class RemoteControl {
    var command: Command?
    
    func pressButton() {
        command?.execute()
    }
}

let light = Light()
let turnOnCommand = TurnOnLightCommand(light: light)
let turnOffCommand = TurnOffLightCommand(light: light)

let remoteControl = RemoteControl()
remoteControl.command = turnOnCommand
remoteControl.pressButton() // "전원이 켜졌습니다."

remoteControl.command = turnOffCommand
remoteControl.pressButton() // "전원이 꺼졌습니다."

위 코드는 전원을 켜고 끄는 Light 클래스와 그 동작을 캡슐화한 TurnOnLightCommand, TurnOffLightCommand 클래스, 그리고 동작을 실행하는 RemoteControl 클래스를 구현한 것입니다. 이를 통해 Command 디자인 패턴이 어떻게 사용되는지 살펴볼 수 있습니다.

Command 패턴은 소프트웨어를 유지보수 가능하게 만들어줄 뿐만 아니라, 동작을 쉽게 추가하거나 수정할 수 있도록 해줍니다. 때문에 이 패턴은 소프트웨어 개발에서 자주 사용되며, 객체 지향적인 디자인을 위한 필수적인 패턴 중 하나입니다.

더 자세한 내용은 Swift Design Patterns: Command 에서 확인할 수 있습니다.