제이슨의 개발이야기

[디자인패턴] 데코레이터 패턴(Decorator Pattern) In java 본문

디자인 패턴

[디자인패턴] 데코레이터 패턴(Decorator Pattern) In java

제이쓰은 2021. 3. 24. 12:03
728x90
반응형

오늘은 데코레이터 패턴 (Decorator Patter) 에 대해서 공부 해보고자 합니다!

 

개인적으로 제가 공부했던 디자인 패턴 중에 가장 기억에 남는 패턴이었구 이 패턴을 잘 이용만 한다면 안드로이드 개발과 기타 응용소프트웨어 개발에도 자주 이용할 수 있을거란 생각이 들었던 패턴이었습니다!!

 

개발을 진행 하다 보면 아래와 같은 문제에 직면하는 경우가 있습니다


조금씩 기능을 추가하기 위해 새로운 클래스를 생성하는 경우 

 - 상속으로 문제를 풀면 너무 많은 상속 관계가 발생할 수 있음

 

이럴 경우 데코레이터 패턴을 사용하면 유지 보수 측면에서도 굉장히 효과적이고 코드의 가독성도 높일 수 있습니다


 

데코레이터 패턴의 정의 

 

데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가

서브클래스를 만드는 것을 통해 기능을 유연하게 확장할 수 있는 방법을 제공합니다

데코레이터 패턴은 자식 클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공합니다

데코레이터 패턴은 상속을 남용하지 않고 연관으로 필요한 기능을 추가하는것 이 특징입니다

 

카페 시스템을 개발한다고 가정했을 때 아래 이미지같은 구성을 할 수 있습니다 

 

그리고 나서 데코레이터 패턴을 적용한 카페 시스템을 이용해서 음료를 주문하고 계산을 하려면 우리의 시스템은

 

일단 특정 음료에서 시작해서 첨가물로 그 음료를 장식 

예 :  모카와 휘핑크림을 추가한 다크 로스트 커피주문 

   - 다크로스트 객체를 가저옴

   - 모카 객체로 장식

   - 휘핑 객체로 장식

   - cost 메소드 호출(첨가물의 가격을 계산하는 일은 해당 객체들에 위임됨)

 

손님 다크로스트 커피에 모카와 휘핑크림을 추가 했으므로 

 

모카 객체를 만들고 그 객체(모카) 로 다크로스트를 감싸도록 함

그리고 휘핑 객체 역시 같은 방식으로 감싸도록 함 

이런식으로 내부 동작이 이루어 질 겁니다 !

여기서 중요한 점은 다크로스트 객체는  Beverage 객체의 상속을 받는 객체 인대 

모카와 휘핑 객체는 CondimentDecorator 의 상속을 받았지만 CondimentDecorator 역시 Beverage객체의 상속을 받음

즉 모카, 휘핑, 다크로스트 역시 Beverage 객체의 메소드를 사용 할 수 있습니다

그리고 해당 커피를 계산하기 위해 cost 메소드를 호출 반환 하는 과정 (데코레이터 패턴 적용사례)

 

실제 코드 

 

메인 클래스

위에 예시와는 다르게 모카를 2개 추가함!!!!

Beverage 추상 클래스

 

Darkroast 클래스

Condimentdecorator 추상 클래스 (사실 빠르게 구현하다보니 해당 클래스에는 내용이 없음)

 

Mocha 클래스

Whip 클래스

 

 다른 클래스(에스프레소 , 하우스블랜드 등등)들은 생략하고 코드 작성을 했습니다 

 

데코레이터 패턴을 이해하기 위해서 이정도 의 코드만 있어도 충분히 이해하는데 도움이 될거라 생각합니다 ㅎㅎ 

 

코드cost 메소드가 호출 , 반환하는 이미지와 함께 보면서 코드 분석하시기 바랍니다 

 

데코레이터 패턴의 중요한 것은 Beverage 추상 클래스 라고 생각합니다 cost 추상 메소드를 작성하고 다른 Darkroast 와 Whip , Mocha 클래스 에 상속을 받고 클래스 안에 Beverage 객체 만들어 놓는것이 중요합니다 

 

저는 디자인 패턴 공부를  직접 해보거나 코드를 보면서 이해하는 공부 방법이 더 효과적이었습니다 여러분들도 저 위의 쉬운 예제를 보면서 공부하거나 분석해보면 분명 쉽게 이해가 되시고 해당 패턴을 어디서 어떤 식으로 이용해야겠구나 라고 느껴지실 거라구 생각합니다!

728x90
반응형