The Decorator Pattern attaches additional responsibilities to an object dynamically

Decorators provide a flexible alternative to subclassing for extending functionality.

 

Decorator Pattern 은 동일한 타입의 객체를 품고 있는 패턴으로, 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 것 외에 원하는 추가적인 작업을 수행할 수 있다.

 

 

아래는 커피를 주문할 때 주문시스템을 구현하는 방식을 데코레이터 패턴으로 나타낸 것이다.

  • 한 객체를 여러 개의 데코레이터로 감쌀 수 있는데, 이때 decorator 의 super class 는 자신이 감싸고 있는 객체의 super class 와 같다 => 따라서 싸여져 있는 객체(ex. darkroast) 대신 다른 프록시를 넣어도 됨
  • 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 것 외에 원하는 추가적인 작업을 수행할 수 있다
  • 상속을 통해 형식을 맞춘다 (상속을 통해 행동을 물려받음X)
  • 팩토리/빌터 패턴과 함께 사용한다.

 

 

 

장점

  • 새 하위 클래스를 만들지 않고 개체의 동작을 확장할 수 있다
  • 런타임에 개체에서 책임을 추가하거나 제거할 수 있다
  • 개체를 여러 데코레이터로 래핑하여 여러 동작을 결합할 수 있다
  • 단일 책임 원칙 => 많은 동작 변형을 구현하는 모놀리식 클래스를 여러 개의 작은 클래스로 나눌 수 있다.

단점

  • 래퍼 스택에서 특정 래퍼를 제거하는 것은 어렵다
  • 동작이 데코레이터 스택의 순서에 의존하지 않는 방식으로 데코레이터를 구현하는 것은 어렵다
  • 구성요소를 초기화하는 데 필요한 코드가 복잡해진다
    • java i/o library `InputStream` => InputStream in = LineNumerInputStream(new BufferedInputStream(new FileInputStream(file)))

언제사용하는가?

  • 개체를 사용하는 코드를 손상시키지 않고 런타임에 개체에 추가 동작을 할당할 수 있어야 하는 경우
  •  상속을 사용하여 개체의 동작을 확장하는 것이 어색하거나 불가능할 때
    • final 클래스의 추가 확장이 필요한 경우 - 기존 동작을 재사용하는 유일한 방법은 데코레이터 패턴을 사용하여 클래스를 자체 래퍼로 래핑하는 방법밖에 없다

'책을 읽자 > Design Patterns' 카테고리의 다른 글

Proxy pattern  (0) 2021.08.18
Template Method Pattern  (0) 2021.08.02
Strategy Pattern  (0) 2021.08.02
Flyweight Pattern  (0) 2021.01.19
Bridge Pattern  (0) 2021.01.19

+ Recent posts