-
반응형
데코레이터 패턴은 데코레이터와 데코레이터로 감싸는 객체의 형식이 같다는 점이 중요하다. 데코레이터에는 데코레이터로 감싸는 객체를 구성요소로 가지고 있어 상속보다 유연하다. 다양한 데코레이터로 실행중에 클래스를 디양하게 꾸밀수 있다.
1. UML
아래는 데코레이터 패턴의 UML이다.
2. 코드
interface Component { fun description(): String { return "Component" } }
class ComponentA: Component { override fun description(): String { return "ComponentA" } }
interface Decorator: Component { val decoratedComponent: Component override fun description(): String { return "Decorator" } }
class DecoratorA(override val decoratedComponent: Component): Decorator { override fun description(): String { return this.decoratedComponent.description() + ", DecoratorA" } }
class DecoratorB(override val decoratedComponent: Component): Decorator { override fun description(): String { return this.decoratedComponent.description() + ", DecoratorB" } }
fun main() { val component: Component = ComponentA() println(component.description()) val componentA: Component = ComponentA() DecoratorA(componentA).also { println(it.description()) } DecoratorB(componentA).also { println(it.description()) } println(DecoratorB(DecoratorA(componentA)).description()) println(DecoratorA(DecoratorB(componentA)).description()) }
3. 실행결과
4. 데코레이터 패턴의 활용
1. java.io 클래스
아래는 다양한 데코레이터(FilterInputStream)와 데코레이터로 감싸는 객체(InputStream, FileInputStream,....)다.
FilterInputStream은 다른 구현체와 비교해봤을 때, 구성으로 InputStream을 가지고 있다. 그러므로, FilterInputStream을 상속한 모든 하위 객체는 데코레이터다.
FileInpuStream과 StringBufferInputStream은 데코레이터가 아닌, 데코레이터로 감싸는 객체이기 때문에 InputStream을 구성으로 같지 않는다. 하지만 ZipInputStream와 BufferedInputStream이기 때문에 InputStream을 구성으로 가지고 있다.
반응형