개발일지

Design Pattern in A..Z - Command 본문

Design Pattern (디자인 패턴)

Design Pattern in A..Z - Command

강태종 2021. 10. 5. 22:48

Command

Command 패턴은 객체의 메소드를 클래스로 만들어 캡슐화 하여 사용하는 패턴입니다.

만약 A Class에서 B Class 기능을 실행하려면 B Class가 의존적으로 필요하지만 Command 패턴을 사용하면 의존성을 제거할 수 있습니다.


불을 키는 Handler를 구현한다고 합시다. 생성자로 불을 키는 클래스를 받고 함수를 실행하면 됩니다.

class NoCommandHandler(
    private val on: LightOnCommand
) {
    fun invoke() {
        on.execute()
    }
}

 

만약 해당 클래스에서 불을 끄는 클래스로 변경한다면 내부의 코드를 변환해야하고 하나의 핸들러로 불을 키고 끄는 기능을 추가한다면 구조를 바꿔야 합니다.

-> 기능과 핸들러가 의존적이고 기능을 바꾸면 핸들러의 코드가 바뀐다.

class NoCommandHandler(
    private val off: LightOffCommand
) {
    fun invoke() {
        off.execute()
    }
}

 

하지만 Command 패턴을 적용한 Handler를 만들면 Command Interface를 통해 동적으로 Command를 바꿀 수 있으며 새로운 기능을 추가할 때 기존의 코드를 변경하는 것이 아닌 새로운 클래스를 만들면서 확장할 수 있습니다.

class Handler {
    var command: Command? = null

    fun invoke() {
        command?.execute()
    }
}

fun main() {
    val handler = Handler()

    handler.command = LightOnCommand()
    handler.invoke()

    handler.command = LightOffCommand()
    handler.invoke()
}
Comments