객체에 추가요소를 동적으로 더할 수 있다. 서브 클래스를 만들 때마다 훨씬 유연하게 확장이 가능하다.
OO 원칙
- 클래스는 확장에는 열려있어야 하지만, 변경에는 닫혀있어야 한다.
Abstract Class
public abstract class Beverage {
// 음료 이름
String description = "Unknown Beverage";
public String getDescription() {
return description;
}
// cost 추상 메서드
public abstract double cost();
}
Concrete Class
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
public double cost(){
return 1.99;
}
}
...
Decorator Class
public abstract class CondimentDecorator {
Beverage beverage; // 데코레이터가 감쌀 음료를 저장
public abstract String getDescription();
}
Decorator Concrete Class
public class Mocha extends CondimentDecorator {
public Mocha(Beverage beverage) {
this.beverage = beverage; // Beverage 객체 참조
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return beverage.cost() + .20;
}
}
Test.java
public class StarbuzzCoffee {
public static void main(String args[]) {
Beverage beverage = new Espresso(); // 객체 생성
System.out.println(beverage.getDescription()
+ " $" + String.format("%.2f", beverage.cost()));
// 데코레이터 패턴 - 객체를 계속 whip
beverage = new Mocha(beverage);
beverage = new Mocha(beverage);
beverage = new Whip(beverage);
System.out.println(beverage.getDescription()
+ " $" + String.format("%.2f", beverage.cost()));
}
}