객체의 결합을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴이다.
기본 기능에 추가할 수 있는 기능의 종류가 많은 경우에 각 추가 기능을 Decorator 클래스로 정의 한 후 필요한 Decorator 객체를 조합함으로써 추가 기능의 조합을 설계 하는 방식이다.
Component는 커피, ConcreteComponent는 케냐 아메리카노, 에티오피아 등 객체(컴포넌트)와 우유, 시럽, 휘핑 크림 (데코레이터 객체)를 조합한다.
public abstract class Coffee {
public abstract void brewing();
}
public abstract class Decorator extends Coffee {
Coffee coffee;
public Decorator(Coffee coffee) {
this.coffee = coffee;
}
@Override
public void brewing() {
coffee.brewing();
}
}
public class KenyaAmericano extends Coffee {
@Override
public void brewing() {
System.out.print("KenyaAmericano ");
}
}
public class EtiopiaAmericano extends Coffee {
@Override
public void brewing() {
System.out.print("EtiopiaAmericano ");
}
}
public class Latte extends Decorator {
public Latte(Coffee coffee) {
super(coffee);
}
public void brewing() {
super.brewing();
System.out.print("Adding Milk ");
}
}
public class Mocha extends Decorator {
public Mocha(Coffee coffee) {
super(coffee);
}
@Override
public void brewing() {
super.brewing();
System.out.print("Adding Mocha Syrup ");
}
}
*참고자료 - 패스트 캠퍼스 온라인 강의