Design Principal 5.
클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.
기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있게 구조를 잡으면 새로운 기능을 아주 유연하게 추가할 수 있으면서도 강하고 견고한 디자인을 만들 수 있습니다. 다만, 무조건 OCP를 적용하는 것은 시간 낭비가 될 수도 있고, 쓸 데 없는 일일 수 있으니 유의하여야 합니다.
데코레이터 패턴은 객체를 다른 객체로 "장식"하는 것입니다. 데코레이터 패턴은 아래와 같이 정의됩니다.
데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다.
새로운 동작은 ConcreteComponent
에 동적으로 추가하게 됩니다.
각 Decorator
안에는 Component
객체가 들어있고, 자신이 장식할 구성요소와 같은 인터페이스 또는 추상 클래스를 구현합니다.
Head First Java에서 예제로 사용하고 있는 코드는 아래와 같습니다.
데코레이터의 특징은 아래와 같습니다.
데코레이터 패턴은 빌더 패턴과 팩토리 패턴과 함께 사용하면 더 "잘 캡슐화 되어 있다"를 깨달을 수 있습니다.
하지만, 데코레이터 패턴을 사용하면 자잘한 객체들이 매우 많이 추가될 수 있고, 데코레이터를 너무 ㅁ낳이 사용하면 코드가 필요 이상으로 복잡해질 수 있으니 유의하여 사용하여야 합니다.
java.io 하위 클래스들도 데코레이터 패턴을 이용하여 만들어져 있습니다.