본문 바로가기
[Developer]/Java

Decorator Pattern

by 해피빈이 2010. 1. 13.

OCP(Open-Cloded Principle)
: 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.

이것을 적용하기 위해서는 가장 바뀔 확률이 높은 부분을 중점적으로 살펴보고 원칙을 적용하는 것이 중요하다.
이러한 능력은 객체지향 시스템 디자인 경험과 지금 건드리고 있는 분야에 대한 지식이 크게 작용하게 된다.
여러 디자인 예를 보다보면 중요한 부분을 골라내는 안목이 향상될 것이다.

데코레이터 패턴은 커피전문점에서 커피를 주문할 때처럼
첨가물을 자유자재로 넣고 빼는데 능숙하게 해준다.
장식하듯이 말이다.

어떤 손님이 모카하고 휘핑 크림을 추가한 다크로스트 커피를 주문한다면??

1. DarkRoast 객체를 가져온다.
2. Mocha 객체로 장식한다.
3. Whip 객체로 장식한다.
4. cost() 메소드를 호출한다. 이때 첨가물의 가격을 계산하는 일은 해당 객체들에게 위임된다.

각 객체는 Beverage클래스를 상속받았기 때문에 cost()메소드를 가지고 있다.
그렇다면 즉 DarkRost를 Mocha로 감싸고, Mocha는 Whip으로 감싼다. 그리고 그것을 cost()메소드로 바깥에서호출을 하면서 안쪽으로 들어와서 최종 리턴을 하면 완성이 된다.


- 데코레이터의 슈퍼클래스는 자신이 장식하고 있는 객체의 슈퍼클래스와 같다.
- 한 객체를 여러개의 데코레이터로 감쌀 수 있다.
- 데코레이터는 자신이 감싸고 있는 객체와 같은 슈퍼클래스를 가지고 있기 때문에 원래 객체가 들어갈 자리에 객체를 집어넣어도 된다.
- 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 것 외에 원하는 추가적인 작업을 수행할 수 있다.
- 객체는 언제든지 감쌀 수 있기 때문에 실행중에 필요한 데코레이터를 마음대로 적용할 수 있다.

** 즉 데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브 클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
반응형

댓글