예시
// 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가지로 구성된다.
- Command
- 인터페이스로, 특정 동작을 실행하기 위한 단일 메소드만 선언한다.
- 구현체에서 특정 동작들을 구현한다.
- Receiver
- 요청을 수행한다.
- Invoker
- 요청을 Receiver에게 보낸다. 단, 직접 보내지 않고 커맨드를 작동시킨다.
- Client
- 커맨드 구현체를 만든다.
- 각각의 커맨드에 Receiver를 설정해주고, 만들어진 커맨드를 Invoker에게 알려준다.
- Command
콜백의 대안으로 사용되며 작업 대기, 작업 기록 추적에도 사용된다.
장단점
장점
- SRP
- 작업 호출과 수행을 분리
- OCP
- 새로운 커맨드 추가
- undo/redo 구현
- 지연된 실행 구현
- 간단한 커맨드의 조함으로 복잡한 동작 가능
단점
- Invoker와 Receiver사이에 layer가 추가되기 때문에 코드가 복잡해진다.
출처
https://refactoring.guru/ko/design-patterns/command
https://ko.wikipedia.org/wiki/커맨드_패턴
Uploaded by N2T
'Programming > 디자인패턴' 카테고리의 다른 글
[Kotlin] Singleton Pattern 예시코드 - 코틀린으로 쓴 디자인 패턴 (0) | 2023.04.17 |
---|---|
[Kotlin] Factory Pattern 예시코드 - 코틀린으로 쓴 디자인 패턴 (0) | 2023.04.06 |
[Kotlin] Decorator Pattern 예시코드 - 코틀린으로 쓴 디자인 패턴 (0) | 2023.04.06 |
[Kotlin] Observer Pattern 예시코드 - 코틀린으로 쓴 디자인 패턴 (0) | 2023.04.05 |
[Kotlin] Strategy Pattern 예시코드 - 코틀린으로 쓴 디자인 패턴 (0) | 2023.04.05 |