데코레이터 패턴(Decorator Pattern)
데코레이터 패턴은 객체지향 디자인 패턴 중 하나로, 기존 클래스의 기능을 동적으로 확장하기 위해 사용되는 패턴입니다.
데코레이터 패턴은 객체를 감싸는 형태로 구현되며, 감싸진 객체의 기능을 수정하거나 확장시킬 수 있습니다. 이를 통해 객체의 기능을 동적으로 확장할 수 있으며, 상속의 문제점을 회피할 수 있습니다.
언제 사용하나요?
데코레이터 패턴은 기존 객체의 기능을 확장해야 할 때 사용됩니다. 상속을 통해 기능을 확장하면 클래스의 수가 증가하고, 서브클래스의 조합에 따라 큰 클래스 계층 구조가 만들어지는 단점이 있습니다. 이러한 문제를 해결하기 위해 데코레이터 패턴을 사용할 수 있습니다.
어떻게 구현되나요?
데코레이터 패턴은 크게 세 가지 요소로 구성됩니다:
Component: 기본 기능을 정의하는 인터페이스 또는 추상 클래스입니다. 예를 들어, 커피를 만드는 기능을 가진
Coffee
클래스가 Component 역할을 합니다.ConcreteComponent: 기본 기능을 실제로 구현하는 클래스입니다. 위의 예시에서 커피 종류를 실제로 만들어주는
Espresso
,Americano
,Latte
등이 이에 해당합니다.Decorator: 추가적인 기능을 덧붙일 수 있는 래퍼 역할을 하는 클래스입니다. 즉, Component를 감싸는 형식으로 구현됩니다. 예를 들어,
Milk
,WhipCream
등을 더할 수 있는 Decorator 클래스들이 있을 수 있습니다.
어떻게 사용하면 되나요?
데코레이터 패턴을 사용하기 위해선 일반적으로 다음과 같은 절차를 따릅니다:
기본 기능을 가진 Component 클래스를 정의합니다.
기본 기능을 실제로 구현한 ConcreteComponent 클래스를 작성합니다.
추가적인 기능을 덧붙일 Decorator 클래스를 정의합니다. 이 클래스는 Component를 감싸는 형식으로 구현되며, 기능을 추가하고자 하는 메서드를 오버라이드합니다.
Decorator 클래스의 생성자에서 Component 객체를 인자로 받아 저장합니다.
Decorator 클래스에서 새로운 기능을 추가합니다. 이때 추가되는 기능은 이미 존재하는 기능을 위임하여 실행합니다.
Client에서 Decorator 객체를 생성하고 이를 사용합니다. Decorator 객체를 생성할 때 Component 객체를 전달하여 원하는 기능을 추가할 수 있습니다.
마무리
데코레이터 패턴은 기존 객체의 기능을 동적으로 확장하기 위해 사용되는 객체지향 디자인 패턴입니다. 이를 통해 상속의 문제점을 회피하고, 간편하게 기능을 추가할 수 있습니다. 세 가지 요소인 Component, ConcreteComponent, Decorator를 적절히 조합하여 사용하면 됩니다.
댓글