티스토리 뷰


Decorator Pattern - 디자인 패턴
 
참고서적 : Head First Design Pattern
소스코드 다운로드 : http://www.wickedlysmart.com/headfirstdesignpatterns/code.html
 
패턴 정의 #3 - Decorator Pattern
데코레이터 패턴(Decorator Pattern)에서는 객체에 추가적인 요건을 동적으로 첨가한다. 
데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다. 
 
디자인 원칙
1. 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.
 
데코레이터 패턴은 포함관계를 나타냅니다. 
기본 Component를 각 Decorator 클래스가 포함함으로써.. 원하는 결과를 가져올 수 있도록 만들어 놓은 것입니다.
 
소스 파일을 보면 이해할 수 있겠지만, 
예를 들어 커피를 주문하는데.. 모카하고 휘핑 크림을 추가한 다크 로스트 커피를 주문한다면 다음과 같은 식으로 처리됩니다.
 
1. DarkRoast 객체를 가져온다.
2. Mocha 객체로 장식한다.
3. Whip 객체로 장식한다.
4. cost() 메소드를 호출한다. 이때 첨가물의 가격을 계산하는 일은 해당 객체들에게 위임된다. 
 
음.. 일단, 다음 클래스다이어그램을 보시고, 소스를 살펴보시기 바랍니다.~
 

 

- Beverage는 가장 기본이 되는 Component 추상 클래스로 볼 수 있습니다.
- 커피 종류마다 Beverage에 대한 구상 클래스를 하나씩 만듭니다. (HouseBlend, DarkRoast, Expresso, Decaf)
- 각각의 첨가물을 나타내는 데코레이터를 추가합니다. cost() 뿐만 아니라 getDescription() 도 구현해야 합니다. 
- 각 데코레이터 안에는 Beverage 클래스가 들어있습니다. 
즉, 데코레이터에는 구성요소에 대한 레퍼런스가 들어있는 인스턴스 변수가 있지요.
 
그리 어려운 개념은 아닌데, 말이 좀 어렵게 되어 있습니다. 
실제 소스와 위 그림을 잘 보시면 이해가 될 것입니다. 
 
자바에서도 java.io 클래스에 데코레이터 패턴이 적용되어 있습니다.
InputStream의 사용을 잘 생각해 보면 위에서 설명한 포함 관계가 맞죠?

 
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함