Component
ConcreteComponent
Decorator
ConcreteDecoratorA, ConcreteDecoratorB
예시코드
public class StarbuzzCoffee {
public static void main(String args[]) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription()
+ " $" + beverage.cost());
Beverage beverage2 = new DarkRoast();
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2);
beverage2 = new Whip(beverage2);
System.out.println(beverage2.getDescription()
+ " $" + beverage2.cost());
Beverage beverage3 = new HouseBlend();
beverage3 = new Soy(beverage3);
beverage3 = new Mocha(beverage3);
beverage3 = new Whip(beverage3);
System.out.println(beverage3.getDescription()
+ " $" + beverage3.cost());
}
}
구조
커피 예시.
자바 I/O
특정 형식에 의존하는 코드에 사용하기 어려움
*ex) 특정 구상 구성요소인지 확인한 다음 어떤 작업을 처리하는 경우.
자잘한 클래스가 너무 많이 추가될 수 있음.(ex) 자바 I/O)
데코레이터를 도입하면 구성요소를 초기화하는데 필요한 코드가 복잡해질수 있는 단점이 있음.
*이때 빌더 패턴(Builder Pattern), factory-pattern을 같이 사용하기도 함.