개발공부

[디자인패턴] 데코레이터 패턴(Decorator Pattern), 랩퍼 패턴(wrapper pattern)

원석💎-dev 2022. 11. 6. 09:00
반응형

 기본 기능에 추가할 수 있는 많은 종류의 부가 기능에서 파생되는 다양한 조합을 동적으로 구현 가능하다.

 

간단한 예제

간단하게 A를 반환하는 객체를 만들고, A반환 객체에 B를 추가로 반환하는 데코레이터를 만들어보자.

interface String {
    fun getString(): String
}

class StringA: String {
    override fun getString(): kotlin.String {
        return "A"
    }
}

class StringB(private val target: String): String {
    override fun getString(): kotlin.String {
        return "${print.getString()}B"
    }
}

fun main(args: Array<kotlin.String>) {
    val stringA: String = StringA()
    println(stringA.getString())

    val decoratorB: String = StringB(stringA)
    println(decoratorB.getString())
}

---
출력 결과: 

A
AB

 

데코레이터 패턴이 적용된 라이브러리: java.io

BufferedInputStream 클래스는 FilterInputStream을 상속 받고 있다.

생성자를 확인해보면 InputStream을 파라미터로 받고, 받은 in을 super로 FilterInputStream 생성자에 보내고 있다.

class BufferedInputStream extends FilterInputStream {

    public BufferedInputStream(InputStream in, int size) {
        super(in);
    ...
    }
}

 

데코레이터가 적용된다는 것은 새로운 책임과 행동이 추가된다는 것이다.

데코레이터 패턴을 사용하면 자잘한 객체가 매우 많이 추가될 우려가 있다.

 

 

반응형