3장 : 데코레이터 패턴

OCP(Open-Closed Principle)

  • 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.

Decorator 패턴

  • 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터느 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.

  • 데코레이터의 수퍼클래스는 자신이 장식하고 있는 객체의 수퍼클래스와 같습니다.

  • 한 객체를 여러 개의 데코레이터로 감쌀 수 있습니다.

  • 데코레이터는 자신이 감싸고 있는 객체와 같은 수퍼클래스를 가지고 있기 때문에 원래 객체(싸여져 있는 객체)가 들어갈 자리에 데코레이터 객체를 집어넣어도 상관 없습니다.

  • 데코레이터는 자신이 장식하고 있는 객체에게 어떤 행동을 위임하는 것 외에 원하는 추가적인 작업을 수행할 수 있습니다.

  • 객체는 언제든 감쌀 수 있기 때문에 실행중에 필요한 데코레이터를 마음대로 적용할 수 있습니다.

언제 사용 ?

구현 방법

장단점

Refactoring Guru Code & Diagram

핵심 정리

  • 상속을 통해 확장을 할 수도 있지만, 디자인의 유연성 면에서 보면 별로 좋지 않습니다.

  • 기존 코드를 수정하지 않고도 행동을 확장하는 방법이 필요합니다.

  • 구성과 위임을 통해서 실행중에 새로운 행동을 추가할 수 있습니다.

  • 상속 대신 데코레이터 패턴을 통해서 행동을 확장할 수 있습니다.

  • 데코레이터 패턴에서는 구성 구성요소를 감싸주는 데코레이터들을 사용합니다.

  • 데코레이터 클래스의 형식은 그 클래스가 감싸고 있는 클래스의 형식을 반영합니다. (상속 또는 인터페이스 구현을 통해서 자신이 감쌀 클래스와 같은 형식을 가지게 됩니다)

  • 데코레이터에서는 자기가 감싸고 있는 구성요소의 메소드를 호출한 결과에 새로운 기능을 더함으로써 행동을 확장합니다.

  • 구성요소를 감싸는 데코레이터의 개수에는 제한이 없습니다.

  • 구성요소의 클라이언트 입장에서는 데코레이터의 존재를 알 수 없습니다. 클라이언트에서 구성요소의 구체적인 형식에 의존하게 되는 경우는 예외입니다.

  • 데코레이터 패턴을 사용하면 자잘한 객체들이 매우 많이 추가될 수 있고, 데코레이터를 너무 많이 사용하면 코드가 필요 이상으로 복잡해질 수도 있습니다.

Last updated