PHpullh
학습 라이브러리/Kotlin/데코레이터 패턴 (Decorator Pattern)

KOTLIN · 객체지향

데코레이터 패턴 (Decorator Pattern)

기존 객체에 동적으로 기능을 추가하는 패턴입니다. Kotlin의 by 위임과 결합하면 보일러플레이트를 크게 줄입니다.

객체지향고급decoratorby-delegationwrappercomposition

핵심 설명

기존 객체에 동적으로 기능을 추가하는 패턴입니다. Kotlin의 by 위임과 결합하면 보일러플레이트를 크게 줄입니다.

Kotlin code

interface TextProcessor {
    fun process(text: String): String
}

class PlainProcessor : TextProcessor {
    override fun process(text: String) = text
}

class UpperCaseDecorator(
    private val inner: TextProcessor
) : TextProcessor by inner {
    override fun process(text: String) =
        inner.process(text).uppercase()
}

class TrimDecorator(
    private val inner: TextProcessor
) : TextProcessor by inner {
    override fun process(text: String) =
        inner.process(text).trim()
}

class PrefixDecorator(
    private val inner: TextProcessor,
    private val prefix: String
) : TextProcessor by inner {
    override fun process(text: String) =
        "$prefix${inner.process(text)}"
}

fun main() {
    val processor = PrefixDecorator(
        UpperCaseDecorator(TrimDecorator(PlainProcessor())),
        "[결과] "
    )
    println(processor.process("  hello kotlin  "))
    // [결과] HELLO KOTLIN
}

학습 팁

데코레이터를 함수형으로 구현할 수도 있습니다: val process = ::trim andThen ::uppercase 형태의 함수 합성이 더 간결할 수 있습니다.

주의할 점

데코레이터 순서가 결과에 영향을 미칩니다. TrimDecorator를 UpperCaseDecorator 뒤에 적용하면 의도와 다른 결과가 나올 수 있습니다.

자주 묻는 질문

데코레이터 패턴 (Decorator Pattern)란 무엇인가요?

기존 객체에 동적으로 기능을 추가하는 패턴입니다. Kotlin의 by 위임과 결합하면 보일러플레이트를 크게 줄입니다.

데코레이터 패턴 (Decorator Pattern) 학습 시 주의할 점은 무엇인가요?

데코레이터 순서가 결과에 영향을 미칩니다. TrimDecorator를 UpperCaseDecorator 뒤에 적용하면 의도와 다른 결과가 나올 수 있습니다.