[디자인패턴] 데코레이터(Decorator) 패턴이란?
Decorator 패턴은 Structural Patten이다.
말 그대로 프로그램을 꾸미면서 확장하는 형식이다.
도로를 그리는 프로그램이 있다. 기본프로그램에서 확장해 교통 상황, 차선, 교차로 등을 그릴 수 있도록 확장하려 한다.
이렇게 새로운 기능이 추가될 때마다 기존 코드를 활용하지 못하고 계속 extends를 통해 클래스를 추가하는 게 가장 단순하다. 이는 SOLID 원칙의 LSP를 위반한다. 기능을 재사용하기 위해 일반화 관계를 사용해서는 안된다.
일반화 관계를 사용하지 말고 연관 관계를 사용하는 방식으로 프로그램을 수정해보자.
이때 Display가 자기 자신을 연관 관계로 맺는 이유가 헷갈렸는데 알고 보면 단순하다. RoadDisplay의 하위 개념으로 있는 클래스인 RoadDisplay, RoadDisplayWithLane, RoadDisplayWithTraffic, RoadDisplayWithCrossing 중 하나의 클래스만을 선택하여 다양한 형태의 도로를 그리고 싶기 때문이다.
만약 도로를 그리는 것은 아주 기본적인 깡통으로 두고 Lane, Traffic 중 하나의 옵션만을 선택하여 도로를 그리고 싶다면??
위 클래스 다이어그램과 같이 LaneDecorator, TrafficDecorator를 포함하는 상위 개념으로 DisplayDecorator를 두고 DisplayDecorator와 RoadDisplay의 상위 개념으로 Display를 두면 된다.
👉 사용자는 RoadDisplay라는 기본 깡통 옵션을 선택할 수도 있고 어느정도 꾸며진 상태인 LaneDecorator나 TrafficDecorator를 선택할 수도 있다.
이를 일반화하여 클래스 다이어그램을 그린다면 다음과 같다.
Decorator 패턴은 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우 유용하다. 가장 좋은 예시는 차량이다. 깡통차 + 다양한 옵션을 추가해 나만의 자동차를 생성할 수 있다.
https://refactoring.guru/ko/design-patterns/decorator