본문 바로가기
Programming/DesignPattern

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

by Blemish 2021. 5. 23.

 

Goal

  • 데코레이터 패턴을 이해한다.

 

데코레이터(Decorator) 패턴

 

데코레이터 패턴은 기본 기능에 추가할 수 있는 많은 종류의 부가 기능에서 파생되는 다양한 조합을 동적으로 구현할 수 있는 패턴

 

클래스 다이어그램

  • Component 클래스에는 기본적인 기능을 뜻하는 ConcreteComponet와 추가 기능에 뜻하는 Decorator의 공통 기능에 대해서 정의한다.
  • ConcreteComponet 클래스에서는 기본적인 기능에 대해서 구체적으로 구현한다.
  • Decorator 클래스에서는 기본적인 기능 외에 추가적인 기능에 대해서 구현한다.
  • ConcreteDecorator 클래스에서는 많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공한다.
  • ConcreteDecorator 클래스에서 추가되는 개별적인 기능을 구현한다. (기본 기능 + 추가되는 개별기능)

 

Example

내비게이션 SW에 도로를 표시하는 기능을 구현해보자.

 

 

내비게이션에 구현해야할 도로 표시 기능

  • 기본 도로 표시
  • 차선 표시

위의 기능을 코드로 작성하여 구현하기 전에 클래스를 다이어그램으로 나타내 보자.

클래스 다이어그램

RoadDisplay 클래스에서 기본도로 표시 기능(Draw)을 구현하고 자식 클래스인 RoadDisplayWithLane 클래스에서 추가적으로 차선 표시 기능(DrawLane)을 구현한다.

 

Question

  • 만약 기존 차선 표시 말고 추가적으로 교통량을 표시하고 싶다면?                                                                       -> RoadDisplayWithLane 클래스와 동일한 방식으로 교통량(RoadDisplayWithTraffic) 클래스를 구현하면 된다. 
  • 여러 기능을 추가한 다음, 기능들을 서로 조합하여 사용한다면? 예를 들어 기본 차선과 교통량과 차선표시, 교차로 표시 기능을 함께 사용한다면?                                                                                                                     ->기본 표시+3가지의 기능(교차로 표시, 교통량, 차선 표시)을 조합하게 된다면 총 8가지의 기능을 구현할 수 있다.
번호 기본표시
(RoadDisplay)
차선표시
(RoadDisplayWithLane)
교통량표시
(RoadDisplayWithTraffic)
교차로 표시
(RoadDisplayWithCrossing)
1      
2    
3    
4    
5  
6  
7  
8

 위의 표대로 기능을 구현해야 한다면 총 7개의 클래스가 추가적으로 구현이 되어야 하며 기존의 차선표시 기능을 추가한 방식처럼 구현한다면 상속을 이용하여 RoadDisplay 하위의 클래스를 정의해야 한다. 

 위에 제시된 기능 말고 추가적으로 부가적인 기능들을 추가하게 된다면 구현해야 할 클래스가 상당히 많아질 수 있다.

따라서 상속을 이용한 기능 추가 방법은 반드시 좋은 방법이라고 할 수는 없다.

 조합 수가 늘어나는 문제를 해결할 수 있는 설계를 하려면 각 추가 기능별로 개별적인 클래스를 설계하고 기능을 조합할 때 각 클래스의 객체 조합을 이용하면 된다.

 

바로 밑에 설계한 클래스 다이어그램은 위의 문제를 해결하기 위해 고안한 설계 예다.

클래스 다이어그램

 

 기본 기능인 RoadDisplay 클래스에 차선을 표시하는 LaneDecorator 클래스와 교통량을 표시하는 TrafficDecorator 클래스이다.

 기본 기능을 이용할 때는 RoadDisplay 하나면 충분하지만 만약 차선표시 기능을 추가하고 싶다면 RoadDisplay와 LaneDecorator 기능을 추가하여 사용한다. 

Display 클래스는 abstract 클래스로 설계하여 하위 클래스인 RoadDisplay와 DisplayDecorator에서 재정의할 수 있도록 하였다. DisplayDecorator는 Display 클래스의 하위 클래스이며 Composition 관계로 설계하였다.

메인 함수에서 기본 기능, 기본기능 + 차선표시, 기본기능 + 차선표시 + 교통량 표시 기능을 사용했다.

 

 

 

 

 

 

댓글