Definition
데코레이터 패턴(Decorator Pattern)으로 객체에 추가 요소를 동적으로 더할 수 있다. 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다.
- Structural Pattern
Situation
- 객체 책임과 행동이 동적으로 수정 가능해야 할때
- 수정을 위한 서브클래싱은 비실용적이거나 불가능할 때
- 구체적인 구현을 둘러싼 많은 객체가 허용될 때
- 객체를 사용하는 코드를 손상시키지 않고 런타임에 객체에 추가 동작을 할당할 수 있어야 하는 경우
- 상속을 사용하여 객체의 동작을 확장하는 것이 어색하거나 불가능 할 때
- Coffee 샵 예제에서 커피에 추가 옵션이 있을 때, whip, 샷 추가, 모카 추가 등등의 전체 가격, 어떤 순서로 원두와 옵션이 추가되었는지를 Decorator 패턴을 통해 얻어 낼 수 있다.
Structure
Pros
- 데코레이터를 사용하면 서브클래스를 만들때보다 훨씬 더 유연하게 기능을 확장할 수 있다. (객체의 behavior를 확장)
- 런타임에 객체에서 책임을 추가하거나 제거할 수 있다.
- 객체를 여러 데코레이터로 래핑하여 여러 동작을 결합할 수 있다.
- 단일 책임 원칙(Single Reponsibility Principle). 다양한 동작 변형을 구현하는 모놀리식 클래스를 여러개의 작은 클래스로 나눌 수 있다.
Cons
- Wrapper 스택에서 특정 wrapper를 제거하는 것은 어렵다.
※ "Wrapper"는 패턴의 주요 아이디어를 명확하게 표현하는 Decorator 패턴의 다른 이름이다. wrapper는 어떠한 타겟 객체와 연결할 수 있는 객체이다.
- Behavior가 데코레이터 스택의 순서에 의존하지 않는 방식으로 데코레이터를 구현하는 것은 어렵다.
- 레이어의 초기 구성 코드는 보기 안좋을 수 있다.
비슷한 패턴
About interfaces
- Adapter는 해당 subject에 대해 다른 인터페이스를 제공한다.
- Proxy는 동일한 인터페이스를 제공한다.
- Decorator는 향상된 인터페이스를 제공한다.
Adapter vs Decorator
- Adapter는 기존 객체의 인터페이스를 변경하는 반면 Decorator는 인터페이스를 변경하지 않고 객체를 향상시킨다.
- Decorator는 Adapter를 사용할 때 불가능한 재귀 컴포지션을 지원한다.
Composite vs Decorator
- 둘 다 유사한 구조 다이어그램을 가지고 있으며 둘다 재귀 구성에 의존하여 무제한 객체 수를 구성한다.
- Decorator는 서브클래싱 없이 객체에 책임을 추가할 수 있도록 설계되었다.
- Composite의 초점은 꾸밈이 아니라 대표이다.
- Composite는 자식 결과를 "요약"한다.
- 이러한 의도는 구별되지만 보완적이다. 결과적으로 Composite와 Decorator는 종종 함께 사용된다. Decorator를 사용하여 Composite tree에서 특정 객체의 동작을 확장할 수 있다.
- Composite 및 Decorator를 많이 사용하는 디자인은 종종 Prototype을 사용하여 이점을 얻을 수 있다. 패턴을 적용하면 복잡한 구조를 처음부터 다시 구성하는 대신 복제할 수 있다.
Chain of Responsibility vs Decorator
- Chain of Responsibility와 Decorator는 클래스 구조가 매우 유사하다.
- 두 패턴 모두 일련의 객체를 통해 실행을 전달하기 위해 재귀 컴포지션에 의존한다.
- CoR 핸들러는 서로 독립적으로 임의의 작업을 실행할 수 있다. 또한 언제든지 요청을 더 이상 전달하지 않을 수 있다.
- Decorator는 기본 인터페이스와 일관성을 유지하면서 객체의 동작을 확장할 수 있다. 또한 Decorator는 요청의 흐름을 중단할 수 없다.
Decorator vs Strategy
- Decorator를 사용하면 객체의 스킨을 변경할 수 있다.
- Strategy를 사용하면 내장을 변경할 수 있다.
Decorator vs Proxy
- Decorator와 Proxy는 구조가 비슷하지만 의도가 매우 다르다.
- 두 패턴 모두 한 객체가 일부 작업을 다른 객체에 위임해야 하는 컴포지션 원칙을 기반으로 한다.
- 차이점은 Proxy는 항상 자체적으로 서비스 객체의 수명 주기를 관리하는 반면 Decorator의 컴포지션은 항상 클라이언트에 의해 제어된다.
OCP -> 클래스는 확장에는 열려있어야 하지만 변경에는 닫혀 있어야 한다.
데코레이터는 자신이 장식하고 있는 객체에서 어떤 행동을 위임하는 일 말고도 추가 작업을 수행할 수 있다.
'Design Pattern' 카테고리의 다른 글
[Design Pattern] 싱글턴 패턴(Single Pattern)에 대해 알아보자 (1) | 2022.06.26 |
---|---|
[Design Pattern] 추상 팩토리 패턴(Abstract Factory Pattern)에 대해 알아보자 (0) | 2022.06.24 |
[Design Pattern] 팩토리 메소드 패턴(Factory Method Pattern)에 대해 알아보자 (0) | 2022.06.23 |
[Design Pattern] 옵저버 패턴(Observer Pattern)에 대해 알아보자 (0) | 2022.06.21 |
[Design Pattern] 전략 패턴(Strategy Pattern)에 대해 알아보자 (0) | 2022.06.20 |
댓글