구조(Structural) 패턴 - Decorator
2007/05/19 16:52
데코레이터 패턴은 새로 상속 받아 클래스를 생성하는 것 없이 개별의 객체들의 행위를 수정할 수 있는 방법을 제공. 8개의 객체들을 가지는 프로그램이 있는 경우.
그러나 그 중 3개는 추가적인 속성이 필요함. 이러한 객체들의 각각에 대하여 상속받아 클래스를 생성할 수도 있고, 많은 경우에 이것은 완벽하게 받아 들일 수 있는 해결책일 수 있음. 그러나, 이 세 객체의 각각이 다른 수정을 요구한다면, 이것은 세 개의 상속 받은 클래스를 생성하는 것을 의미. 게다가, 클래스들 중에 하나가 다른 두개 클래스의 특성을 가지고 있다면, 혼란스럽고 불필요한 클래스를 생성.
1. 의도
프로그램 실행 중에 특정 객체에게 추가적인 책임들을 동적으로 할당할 수 있음. 기능을 확장할 때 기존 클래스를 상속 받지 않고 문제를 해결할 때 사용.
2. 고려해야 할 사항
상속을 이용해 기능 확장을 할 경우 다음과 같은 문제 발생

4. 자바 프로그래밍 언어에서의 사용 예

그러나 그 중 3개는 추가적인 속성이 필요함. 이러한 객체들의 각각에 대하여 상속받아 클래스를 생성할 수도 있고, 많은 경우에 이것은 완벽하게 받아 들일 수 있는 해결책일 수 있음. 그러나, 이 세 객체의 각각이 다른 수정을 요구한다면, 이것은 세 개의 상속 받은 클래스를 생성하는 것을 의미. 게다가, 클래스들 중에 하나가 다른 두개 클래스의 특성을 가지고 있다면, 혼란스럽고 불필요한 클래스를 생성.
1. 의도
프로그램 실행 중에 특정 객체에게 추가적인 책임들을 동적으로 할당할 수 있음. 기능을 확장할 때 기존 클래스를 상속 받지 않고 문제를 해결할 때 사용.
2. 고려해야 할 사항
상속을 이용해 기능 확장을 할 경우 다음과 같은 문제 발생
- 서브 클래스는 슈퍼 클래스에서 필요하지 않은 기능까지 상속 받기 때문에, 서브 클래스는 비대해지고 응집력이 떨어지게 됨.
- 복사-붙이기 방식을 이용해 같은 코드를 여러 클래스에 추가할 경우, 시스템에 어떤 변동사항이 발생했을 때 관리하가 어려워짐.
- 클래스의 기능이 간단한 방법을 이용해 확장될 수 있어야 함.
- 클래스에 필요한 기능을 다이나믹 하게 추가하거나 또는 제거할 수 있어야 함.
- 클래스의 응집력을 높여야 하고 코드 중복을 최소화해야 함.

4. 자바 프로그래밍 언어에서의 사용 예

- java.io 패키지에서 Decorator 패턴이 사용됨.
- FileInputStream, ByteArrayInputStream, 기타 다른 클래스들은 InputStream 추상
클래스를 상속 받음. 게다가, 입력 소스가 무엇이든 상관없이 input stream에
기능을 추가할 수 있는 클래스는 InputStream 추상 클래스를 확장 받으면 됨. - BufferedInputStream, DataInputStream 클래스와 같은 추가적인 기능을 정의하고 있는
클래스들이 “데코레이터(Decorator)”들 임. - 데코레이터(Decorator)가 제공하는 메소드가 호출되었을 때, 이들이 장식하고 있는
클래스들의 대응되는 메소드를 호출.
- 장점
단순한 상속보다는 설계의 융통성을 증대시킬 수 있음. Decorator 패턴은 객체에 새로운 행위를 추가할 수 잇는 가장 효과적인 방법임. Decorator를 사용하면, 테코리이터를 개체와 연결하거나 분리하는 작업을 통해 새로운 책임을 추가하거나 삭제하는 일이 런타임 시에 가능해짐. 그러나 상속은 코드상에서, 즉, 정적으로 새로운 클래스를 추가해야만 추가적인 행위를 정의할 수 있는 방법임.
지금 예상하지 못한 특성들을 한꺼번에 다 개발하기 위해 고민하고 노력하기보다는 지속적으로 Decorator 객체를 통해 발겨하지 못하고 누락된 서비스들을 추가 할 수 있음. - 단점
장식의 역할을 수행하는 객체와 장식을 받게 되는 역할을 수행하는 객체는 서로 다름. 그래서 식별자가 문제 될 수 있음.
테코레이터를 사용함으로써 작은 규모의 객체들을 많이 생성하게 됨에 따라, 수행 속도가 약간 떨어질 수 있음.






