- 주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴
- 기본 기능을 가지고 있는 클래스를 하나 만들어주고 추가할 수 있는 기능들을 추가하기 편하도록 설계하는 방식
위의 재료들을 모두 클래스로 구현한다면 너무 많은 클래스를 구현해주어야 한다.
→ 비효율적(커피의 종류가 많을 수록 더 비효율적임)
public interface Component {
String add(); //재료 추가
}
public class BaseComponent implements Component {
@Override
public String add() {
// TODO Auto-generated method stub
return "에스프레소";
}
}
abstract public class Decorator implements Component {
private Component coffeeComponent;
public Decorator(Component coffeeComponent) {
this.coffeeComponent = coffeeComponent;
}
public String add() {
return coffeeComponent.add();
}
}
//물을 추가해주는 클래스
public class WaterDecorator extends Decorator {
public WaterDecorator(Component coffeeComponent) {
super(coffeeComponent);
}
@Override
public String add() {
// TODO Auto-generated method stub
return super.add() + " + 물";
}
}
//우유를 추가해주는 클래스
public class MilkDecorator extends Decorator {
public MilkDecorator(Component coffeeComponent) {
super(coffeeComponent);
}
@Override
public String add() {
// TODO Auto-generated method stub
return super.add() + " + 우유";
}
}
public class Main {
public static void main(String[] args) {
Component espresso = new BaseComponent();
System.out.println("에스프레소 : " + espresso.add());
Component americano = new WaterDecorator(new BaseComponent());
System.out.println("아메리카노 : " + americano.add());
Component latte = new MilkDecorator(new WaterDecorator(new BaseComponent()));
System.out.println("라떼 : " + latte.add());
}
}