
Component.interface
public interface Component {
String add(); //재료 추가
}
BaseComponent.java
public class BaseComponent implements Component {
@Override
public String add() {
// TODO Auto-generated method stub
return "에스프레소";
}
}
Decorator.java
abstract public class Decorator implements Component {
private Component coffeeComponent;
public Decorator(Component coffeeComponent) {
this.coffeeComponent = coffeeComponent;
}
public String add() {
return coffeeComponent.add();
}
}
WaterDecorator.java
//물을 추가해주는 클래스
public class WaterDecorator extends Decorator {
public WaterDecorator(Component coffeeComponent) {
super(coffeeComponent);
}
@Override
public String add() {
// TODO Auto-generated method stub
return super.add() + " + 물";
}
}
MilkDecorator.java
//우유를 추가해주는 클래스
public class MilkDecorator extends Decorator {
public MilkDecorator(Component coffeeComponent) {
super(coffeeComponent);
}
@Override
public String add() {
// TODO Auto-generated method stub
return super.add() + " + 우유";
}
}
Main.java
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());
}
}
// 결과
// 에스프레소 : 에스프레소
// 아메리카노 : 에스프레소 + 물
// 라떼 : 에스프레소 + 물 + 우유