데코레이터 패턴은 동적으로 행동을 추기하기 위한 패턴이다.
상속은 정적이기에 구성으로 구현된다.
public interface Beverage {
int getCost();
String getDescription();
}
public class PlainBeverage implements Beverage {
@Override
public int getCost() {
return 5;
}
@Override
public String getDescription() {
return "Plain Beverage";
}
}
public abstract class BeverageDecorator implements Beverage {
protected Beverage beverageDecorator;
public BeverageDecorator(Beverage beverage) {
this.beverageDecorator = beverage;
}
}
public class Milk extends BeverageDecorator {
public Milk(Beverage beverage) {
super(beverage);
}
@Override
public int getCost() {
return beverageDecorator.getCost() + 3;
}
@Override
public String getDescription() {
return beverageDecorator.getDescription() + " milk";
}
}
public class Sugar extends BeverageDecorator {
public Sugar(Beverage beverage) {
super(beverage);
}
@Override
public int getCost() {
return beverageDecorator.getCost() + 2;
}
@Override
public String getDescription() {
return beverageDecorator.getDescription() + " sugar";
}
}
public static void main(String[] args) {
Beverage b = new Sugar(new Milk(new PlainBeverage()));
System.out.println(b.getDescription());
System.out.println(b.getCost());
}
PlainBeverage 와 BeverageDecoration 구현체 모두 Beverage 인터페이스를 구현했다.