본문 바로가기
Design Pattern

[Design Pattern] 데코레이터 패턴(Decorator Pattern)에 대해 알아보자

by 개발자J의일상 2022. 6. 23.
반응형

Definition

데코레이터 패턴(Decorator Pattern)으로 객체에 추가 요소를 동적으로 더할 수 있다. 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있다.

- Structural Pattern

 

Situation

- 객체 책임과 행동이 동적으로 수정 가능해야 할때

- 수정을 위한 서브클래싱은 비실용적이거나 불가능할 때

- 구체적인 구현을 둘러싼 많은 객체가 허용될 때

- 객체를 사용하는 코드를 손상시키지 않고 런타임에 객체에 추가 동작을 할당할 수 있어야 하는 경우

- 상속을 사용하여 객체의 동작을 확장하는 것이 어색하거나 불가능 할 때

- Coffee 샵 예제에서 커피에 추가 옵션이 있을 때, whip, 샷 추가, 모카 추가 등등의 전체 가격, 어떤 순서로 원두와 옵션이 추가되었는지를 Decorator 패턴을 통해 얻어 낼 수 있다.

 

Structure

https://refactoring.guru/design-patterns/decorator

 

Pros

- 데코레이터를 사용하면 서브클래스를 만들때보다 훨씬 더 유연하게 기능을 확장할 수 있다. (객체의 behavior를 확장)

- 런타임에 객체에서 책임을 추가하거나 제거할 수 있다.

- 객체를 여러 데코레이터로 래핑하여 여러 동작을 결합할 수 있다.

- 단일 책임 원칙(Single Reponsibility Principle). 다양한 동작 변형을 구현하는 모놀리식 클래스를 여러개의 작은 클래스로 나눌 수 있다.

Cons

- Wrapper 스택에서 특정 wrapper를 제거하는 것은 어렵다.

※ "Wrapper"는 패턴의 주요 아이디어를 명확하게 표현하는 Decorator 패턴의 다른 이름이다. wrapper는 어떠한 타겟 객체와 연결할 수 있는 객체이다.

- Behavior가 데코레이터 스택의 순서에 의존하지 않는 방식으로 데코레이터를 구현하는 것은 어렵다.

- 레이어의 초기 구성 코드는 보기 안좋을 수 있다.

비슷한 패턴

About interfaces

- Adapter는 해당 subject에 대해 다른 인터페이스를 제공한다.

- Proxy는 동일한 인터페이스를 제공한다.

- Decorator는 향상된 인터페이스를 제공한다.

 

Adapter vs Decorator

- Adapter는 기존 객체의 인터페이스를 변경하는 반면 Decorator는 인터페이스를 변경하지 않고 객체를 향상시킨다. 

- DecoratorAdapter를 사용할 때 불가능한 재귀 컴포지션을 지원한다.

 

Composite vs Decorator

- 둘 다 유사한 구조 다이어그램을 가지고 있으며 둘다 재귀 구성에 의존하여 무제한 객체 수를 구성한다.

- Decorator는 서브클래싱 없이 객체에 책임을 추가할 수 있도록 설계되었다.

- Composite의 초점은 꾸밈이 아니라 대표이다.

- Composite는 자식 결과를 "요약"한다.

- 이러한 의도는 구별되지만 보완적이다. 결과적으로 CompositeDecorator는 종종 함께 사용된다. Decorator를 사용하여 Composite tree에서 특정 객체의 동작을 확장할 수 있다.

- CompositeDecorator를 많이 사용하는 디자인은 종종 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 -> 클래스는 확장에는 열려있어야 하지만 변경에는 닫혀 있어야 한다.

 

데코레이터는 자신이 장식하고 있는 객체에서 어떤 행동을 위임하는 일 말고도 추가 작업을 수행할 수 있다.

300x250

댓글