Skip to Content
Suffering builds character

4.데코레이터 패턴

Decorator라는 이름은 케익이 담긴 선물 상자처럼 실제 내용물인 케익 위에 플레이팅을 하고, 케익 박스로 포장 후 쇼핑백에 담는 것처럼 부가적인 효과를 부여해줄 수 있기 때문에 지어진 이름이라고 볼 수 있음

기술적으로는 타겟에 부가적인 기능을 런타임 시점에 동적으로 부여해주기 위해 프록시 객체를 사용하는 패턴

런타임 시점에 동적으로 부여해준다는 의미는 코드를 작성하는 컴파일 시점에서는 어떤 방법과 순서로 프록시와 타겟 객체가 연결되어 사용되는지 정해져 있지 않다는 의미

따라서 데코레이터 패턴은 프록시가 꼭 하나로 제한되지 않으며, 여러 개의 프록시를 사용할 수 있음

1-1. 데코레이터 패턴이 적용된 대표적인 예시

java.io.InputStream, java.io.OutputStream

Main.java
InputStream inputStream = new BufferedInputStream(new FileInputStream("a.txt"));

FileInputStream은 InputStream 인터페이스를 구현한 구체적인 입력 스트림 클래스(타겟 객체) 이고, BufferedInputStream은 이를 감싸서 버퍼링 기능을 추가로 제공하는 데코레이터 객체임

즉, 데코레이터 패턴을 적용하여 FileInputStream이 제공하는 파일 읽기 기능에 버퍼링을 통한 성능 최적화라는 부가 기능을 더한 구조

이러한 데코레이터 패턴은 타겟 객체 내 코드를 변경하지 않고, 클라이언트 쪽에서 호출하는 방법도 변경하지 않으면서 새로운 기능을 추가하고자 할 때 유용한 방식이라고 볼 수 있음

Last updated on