객체에 동적으로 새로운 기능을 추가할 수 있게 해줍니다.

이 패턴은 상속을 사용하지 않고도 객체의 기능을 확장할 수 있는 유연한 방법을 제공합니다.

주요 개념

컴포넌트 인터페이스(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을 상속받아 기본적인 출력 스트림의 인터페이스를 따릅니다.