[swift] Command 디자인 패턴

Command 디자인 패턴은 객체 간의 상호 작용을 캡슐화하여 실행될 수 있는 단일 명령을 나타내는 패턴입니다. 이것은 명령을 객체로 만들어 스택에 넣거나 다른 객체에 전달하여 실행할 수 있게 합니다.

왜 Command 패턴을 사용해야 할까요?

Command 패턴은 기능을 실행하는 객체와 이를 호출하는 객체 간의 의존성을 줄여 코드를 더 유연하고 확장 가능하게 만듭니다. 예를 들어, 사용자의 요청을 개별적인 객체로 캡슐화하여 실행 순서를 제어하고, 실행 취소와 다시 실행을 지원할 수 있습니다.

Command 패턴의 구성 요소

  1. Command: 실행될 작업을 캡슐화하는 인터페이스를 정의합니다.
  2. ConcreteCommand: Command 인터페이스를 구현하는 클래스로, 실제 작업을 수행하는 메서드를 정의합니다.
  3. Invoker: 명령을 실행하는 객체입니다.
  4. Receiver: 실제 작업을 수행하는 객체를 나타내며, ConcreteCommand에서 실행됩니다.
  5. Client: ConcreteCommand 객체를 생성하고 Invoker에 전달하여 명령을 실행합니다.

예시

다음은 Swift에서 Command 패턴을 사용한 예시입니다.

// Command 프로토콜 정의
protocol Command {
    func execute()
}

// ConcreteCommand 클래스 구현
class LightOnCommand: Command {
    private var light: Light
    
    init(light: Light) {
        self.light = light
    }
    
    func execute() {
        light.turnOn()
    }
}

// Receiver 클래스
class Light {
    func turnOn() {
        // 불을 켜는 동작
    }
}

// Invoker 클래스
class RemoteControl {
    private var command: Command?
    
    func setCommand(command: Command) {
        self.command = command
    }
    
    func pressButton() {
        command?.execute()
    }
}

// Client
let remote = RemoteControl()
let light = Light()
let lightOnCommand = LightOnCommand(light: light)
remote.setCommand(command: lightOnCommand)
remote.pressButton() // 불을 켭니다

위 예시에서는 불을 켜는 명령을 캡슐화하고, Invoker를 통해 명령을 실행합니다.

Command 패턴은 객체 간의 결합을 줄이고, 수정이 용이한 코드를 작성할 수 있도록 도와줍니다. 확장 가능하고 유지보수가 쉬운 소프트웨어를 설계하는 데 유용한 패턴 중 하나입니다.

결론

Command 패턴은 객체 지향 소프트웨어 디자인에서 유용하게 활용될 수 있는 강력한 도구입니다. 객체 간의 상호 작용을 보다 유연하고 확장 가능하게 만들면서, 코드의 가독성과 유지보수성을 향상시킬 수 있습니다. Command 패턴을 적절히 활용하면 복잡한 상황에서도 간단하고 효율적인 솔루션을 제공할 수 있습니다.