객체에 동적으로 새로운 기능을 추가할 수 있게 해줍니다.
이 패턴은 상속을 사용하지 않고도 객체의 기능을 확장할 수 있는 유연한 방법을 제공합니다.
컴포넌트 인터페이스(Component Interface): 기본 객체와 데코레이터가 구현해야 하는 인터페이스를 정의합니다.
콘크리트 컴포넌트(Concrete Component): 기본 객체로, 데코레이터가 추가될 대상입니다.
데코레이터(Decorator): 컴포넌트 인터페이스를 구현하며, 컴포넌트를 감싸서 추가 기능을 제공합니다. 데코레이터는 다른 데코레이터나 기본 컴포넌트를 포함할 수 있습니다.
콘크리트 데코레이터(Concrete Decorator): 데코레이터의 구체적인 구현체로, 추가 기능을 정의합니다.
Component
+ operation()
^
|
ConcreteComponent
^
|
Decorator
+ operation()
^
|
ConcreteDecoratorA
+ operation()
ConcreteDecoratorB
+ operation()
FilterOutputStream이 어떤식으로 데코레이터 패턴을 적용 한 거죠 ?
기본 컴포넌트: OutputStream은 기본 컴포넌트입니다.
데코레이터: FilterOutputStream은 기본 컴포넌트를 확장하여 추가 기능을 제공하는 데코레이터입니다.
구체적인 데코레이터: BufferedOutputStream은 FilterOutputStream을 확장하여 구체적인 기능(버퍼링)을 추가합니다.
이와 같이 FilterOutputStream은 데코레이터 패턴을 통해 스트림에 다양한 추가 기능을 동적으로 제공할 수 있도록 설계되었습니다.
데코레이터 패턴은 상속을 사용하여 기본 기능을 제공하는 동시에, 객체 조합(Composition)을 통해 기능을 확장할 수 있는 유연한 방법을 제공합니다. ****
여기서 혼동이 있을 수 있는 점을 명확히 하겠습니다.
상속: 데코레이터 패턴에서 상속은 기본적인 인터페이스 또는 추상 클래스를 확장하는 데 사용됩니다. 예를 들어, FilterOutputStream은 OutputStream을 상속받아 기본적인 출력 스트림의 인터페이스를 따릅니다.