예시

// Invoker
class Switch(private val flipUpCommand: Command, private val flipDownCommand: Command) {
    fun flipUp() {
        flipUpCommand.execute()
    }

    fun flipDown() {
        flipDownCommand.execute()
    }
}

// Receiver
class Light {
    fun turnOn() {
        println("The light is on")
    }

    fun turnOff() {
        println("The light is off")
    }
}

// Command
interface Command {
    fun execute()
}

class TurnOnLightCommand(private val theLight: Light) : Command {
    override fun execute() {
        theLight.turnOn()
    }
}

class TurnOffLightCommand(private val theLight: Light) : Command {
    override fun execute() {
        theLight.turnOff()
    }
}

// Client
fun main(args: Array<String>) {
    val light = Light()
    val switchUp: Command = TurnOnLightCommand(light)
    val switchDown: Command = TurnOffLightCommand(light)
    val s = Switch(switchUp, switchDown)
    s.flipUp()
    s.flipDown()
}

개념

커맨드 패턴은 사용자의 요청을 요청에 대한 모든 정보가 포함된 객체로 캡슐화하는 디자인 패턴이다. 요청의 처리를 지연하거나 대기열에 넣거나, 실행취소할 수 있는 작업들을 지원한다.
  • 커맨드 패턴은 4가지로 구성된다.
    1. Command
      • 인터페이스로, 특정 동작을 실행하기 위한 단일 메소드만 선언한다.
      • 구현체에서 특정 동작들을 구현한다.
    1. Receiver
      • 요청을 수행한다.
    1. Invoker
      • 요청을 Receiver에게 보낸다. 단, 직접 보내지 않고 커맨드를 작동시킨다.
    1. Client
      • 커맨드 구현체를 만든다.
      • 각각의 커맨드에 Receiver를 설정해주고, 만들어진 커맨드를 Invoker에게 알려준다.

콜백의 대안으로 사용되며 작업 대기, 작업 기록 추적에도 사용된다.

장단점

장점

  • SRP
    • 작업 호출과 수행을 분리
  • OCP
    • 새로운 커맨드 추가
  • undo/redo 구현
  • 지연된 실행 구현
  • 간단한 커맨드의 조함으로 복잡한 동작 가능

단점

  • Invoker와 Receiver사이에 layer가 추가되기 때문에 코드가 복잡해진다.

출처

https://refactoring.guru/ko/design-patterns/command

https://ko.wikipedia.org/wiki/커맨드_패턴


Uploaded by N2T

+ Recent posts