데코레이터 패턴(decorator pattern)은 객체에 추가적인 요건을 동적으로 추가 한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
데코레이터 패턴을 사용하면 원래 클래스의 코드는 전혀 바꾸지 않고도 내가 만든 객체에 새로운 임무를 부여할 수 있다.
- 데코레이터의 슈퍼클래스는 자신이 장식하고 있는 슈퍼클래스와 같다.
- 한 객체를 여러 개의 데코레이터로 감쌀 수 있다.
- 데코레이터는 자신이 감싸고 있는 객체와 같은 슈퍼클래스를 가지고 있기 때문에 원래 객체(싸여져 있는 객체)가 들어갈 자리에 데코레이터 객체를 집어넣어도 상관없다.
- 데코레이터는 자신이 장식하고 있는 객체에서 어떤 행동을 위임하는 것 외에 원하는 추가적인 작업을 수행할 수 있다.
- 객체는 언제든지 감쌀 수 있기 때문에 실행중에 필요한 데코레이터를 마음대로 적용할 수 있다.
OCP(open-closed principle)
확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다. 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가 하는 것이 목표이다.
Milk, Mocha, Soy, Whip 는 각각의 첨가물을 나타내는 데코레이터이다.
특정 음료에 첨가물로 음료를 장식(Decoration) 할 수 있다. 기존의 음료는 건드리지 않은 채로 첨가물을 추가하여(= 확장을 통해) 새로운 행동을 간단하게 추가하는 것이 바로 데코레이터 패턴이다.
이처럼 데코레이터 패턴을 사용하면 인터페이스는 바꾸지 않고 책임(기능)만 추가할 수 있다.
하지만 데코레이터 패턴을 사용하면 잡다한 클래스들이 너무 많아진다는 단점이 있다.
데코레이터 패턴을 사용하면 인터페이스를 바꾸지 않아도 쉽게 기능 추가가 가능해서 편해서 코드를 확장하기 좋다. (OCP 를 아주 잘 지키는 듯)
하지만 기능을 덧붙이다 보면 클래스가 너무 방대해질 것 같다. 객체를 잘 분리해놓지 않으면 구조를 파악하기 어렵고 오히려 복잡해질 수 있다.
아무튼 그렇다 🐿