기존 시스템
→ 위와 같은 설계는 OCP(개방 - 폐쇠의 원칙)을 위반한다.
클래스의 확장에는 열려 있고 변경에는 닫혀 있어야 한다.
- 기존 코드에 대한 변경을 최소화하면서 기능을 추가할 수 있도록 설계해야한다.
- 확장
- 코드의 유연성 증가 (코드의 수정이 아닌 추가를 통해 확장하는 것이 정석)
- 변경
- 객체의 직접적 수정을 제한
결론
즉 우리는 객체의 행동을 동적으로 변경하고 싶다면 상속은 좋은 방법이 아닐 수 있다.
집합 관계란 한 객체가 다른 객체에 대한 참조를 가짐으로서 일부 작업을 위임하는 것
- 데코레이터 패턴은 이러한 객체의 집합 관계를 응용한 디자인 패턴이다.
객체의 추가 요소를 동적으로 더할 수 있어 유연한 기능 확장이 가능한 디자인 패턴
- 데코레이터는 자신이 장식하는 객체(감싸는 객체)에게 행동을 위임하거나 추가 작업 수행 가능
- 데코레이터의 슈퍼 클래스는 자신이 장식하는 슈퍼클래스와 동일
- 이를 통해 객체의 집합 관계를 구현하는 것이다 !
- 하나의 객체를 여러 개의 데코레이터로 감쌀 수 있다.
public class Main {
public static void main(String[] args) {
Beverage beverage = new HouseBlend();
System.out.println(beverage.getDescription());
System.out.println(beverage.getClass());
beverage = new Milk(beverage);
System.out.println(beverage.getDescription());
System.out.println(beverage.cost());
beverage = new Soy(beverage);
System.out.println(beverage.getDescription());
System.out.println(beverage.cost());
}
}
Result
House Blend :
3.0
House Blend : + MILK
4.0
House Blend : + MILK + 두유
6.0