티스토리 뷰

진리는어디에

Decorator Pattern

kukuta 2007. 11. 11. 20:10

의도
  객체에 기능을 동적으로 추가/삭제하기 위해 사용. 상속을 이용하지 않고 객체의 합성을 이용하므로 flexiblity가 높다.

동기
  클래스 전체가 아닌 각각의 객체마다 특정한 기능을 추가 시기고자 하는 경우. 예를 들자면 Text view가 있고, 그 text view에 스크롤바나 border를 추가 하고자 한다. 이 스크롤바나 borader 기능은 사용 될 때도 있고 그렇지 않을 때도 있으며, 두 가지 기능이 동시에 사용 될 때도 있고, 한 가지씩 따로 사용 될 때도 있다. 이렇게 다이나믹한 관계를 가지는 기능들을 상속을 이용해서 구현한다면 스크롤바가 첨가 된 text view, border가 첨가 된 text view, 스크롤바와 border가 동시에 첨가된 text view등등 클래스의 수가 폭발적으로 늘어날 가능성이 있고, 새로운 케이스가 발생할 때 마다 새로운 클래스를 만들어야 하는 단점 있다.

  이런 상속의 단점을 해결하기 위해 객체의 합성을 이용 하는, 즉, 추가 되고자 하는 특정 기능을 클래스로 구현하고, 그 인터페이스를 user class가 내포 하므로써 동적으로 추가 기능을 변경 가능토록 하고, 또한 추가 기능 클래스가 다른 추가 기능클래스를 내포하는 재귀적인 형태를 가짐으로써 여러 가지 기능의 추가가 가능토록 할 수 있는 패턴이 Decorator Pattern이다.

구조

사용자 삽입 이미지
참여 객체
 * Component의 역할
   추가 기능이 되는 decorator(border)와 그것을 사용하는 concrete component(text view)의 인터페이스
 * ConcreteComponent
   Component의 인터페이스를 구체적으로 구현
 * Decorator(장식자)
   Component 역할과 동일한 인터페이스를 가짐
   Decorator할 대상이 되는 Component의 역할 또한 가지고 있음
 * ConcrteDecorator(구체적인 장식자)
   구체적인 Decorator의 역할

결과
 - 상속을 이용하여 기능을 추가 하는 것 보다, 합성을 이용하여 구현하므로 보다 높은 유연성을 제공한다.
 - 동일한 기능을 반복하는 것이 간단해 진다.
 - 해당패턴은 복잡한 클래스들을 미리 정의 해 놓으므로써 예측가능한 모든 특성들을 지원하는 것이 아니라 기능의 필요에 따라 '점진적으로 확장'해 나갈 수 있는 형태를 띄고 있다.
 - Decorator pattern은 클래스의 수는 줄어드는 반면 객체의 수는 늘어나는 성향이 있다. 또한 이들 객체는 서로 다른 객체임에도 불구하고 연결된 형태(예를 들어 decorator가 또 다른 decorator를 내포한다던지..)에 따라 비슷하게 보이는 경우도 있다. 따라서 해당 패턴을 적용한 경우 해당 패턴에 대해서 잘 알고 있지 못하면 이해하거나 디버깅하기 어려울 수도 있다.

Decorator, Adapter, Composite 패턴

 이 세 개의 패턴 클래스 간에는 본질적인 유사성이 있다. Adapter 클래스는 기
존의 클래스를 장식하는 역할을 수행하는 것처럼 보인다. 그러나 해당 클래스
의 기능은 특정 프로그램에 대하여 좀더 편리한 클래스의 인터페이스로 변경하
는 작업을 수행하는 것이다. Decorator 클래스는 클래스의 코든 인스턴스보다는
특정 인스턴스에 메소드를 추가한다.
 
여기에서 가능성 있는 상황과 단일 항목으로 구성된 composite 클래스가 본질
적으로는 decorator 클래스라는 것이다. 그러나 다시 말하지만, 의도는 다르다.

(http://blog.naver.com/smurpettt/150000478580)


Ref.
 자바로 배우는 디자인 패턴
 GoF Design Patterns
 Headfirst Design Pattern
 http://blog.naver.com/cosmosb612?Redirect=Log&logNo=80040955894
 http://blog.naver.com/smurpettt/150000478580

'진리는어디에' 카테고리의 다른 글

STL map의 요소 삭제시 주의 할 점  (7) 2007.12.13
volatile - Multithreaded Programmer's Best Friend  (6) 2007.12.05
Decorator Pattern  (3) 2007.11.11
DLL에서 EXE의 함수 호출하기  (1) 2007.11.03
Flyweight Pattern  (2) 2007.10.24
Composite Pattern  (2) 2007.10.23
TAG
댓글
댓글쓰기 폼