1. 데코레이터 패턴 (Decorator pattern)
객체의 결합을 통해 기능을 동적으로 확장하는 패턴으로 기본 기능에 추가 기능인 Decorator 객체를 결합하는 기법
2. 컴포넌트와 데코레이터의 구조
3. 컴포넌트 클래스
public abstract class Coffee {
public abstract void brewing();
}
public class EtiopiaAmericano extends Coffee{
@Override
public void brewing() {
System.out.print("EtiopiaAmericano ");
}
}
4. 데코레이터 클래스
public abstract class Decorator extends Coffee{
Coffee coffee; # 컴포넌트 인스턴스를 멤버변수로 가짐
public Decorator(Coffee coffee){
this.coffee = coffee;
}
@Override
public void brewing() {
coffee.brewing(); # 컴포넌트의 brewing() 메서드 수행
}
}
public class Latte extends Decorator{
public Latte(Coffee coffee) {
super(coffee); # 상위 클래스에 기본 생성자가 없기 때문에 super() 호출
}
public void brewing() {
super.brewing(); # 원본 데코레이터 수행
System.out.print("Adding Milk "); # 자신만의 메서드 수행
}
}
public class Mocha extends Decorator{
public Mocha(Coffee coffee) {
super(coffee); # 상위 클래스에 기본 생성자가 없기 때문에 super() 호출
}
public void brewing() {
super.brewing(); # 원본 데코레이터 수행
System.out.print("Adding Mocha Syrup "); # 자신만의 메서드 수행
}
}
5. 데코레이터를 이용한 커피 머신 프로그램
public class CoffeeTest {
public static void main(String[] args) {
EtiopiaAmericano coffee = new Mocha(new Latte(new EtiopiaAmericano()));
coffee.brewing();
}
}
##### 출력 결과 #####
EtiopiaAmericano Adding Milk Adding Mocha Syrup
6. 동작 과정
① Mocha 인스턴스의 coffee.brewing(); 호출
② super.brewing(); 호출
③ coffee.brewing(); 호출
④ Latte 인스턴스의 coffee.brewing(); 호출
⑤ super.brewing(); 호출
⑥ coffee.brewing(); 호출
⑦ EtiopiaAmericano 인스턴스의 brewing(); 호출
⑧ Latte 인스턴스의 print(Adding Milk)
⑨ Mocha 인스턴스의 print(Adding Mocha Syrup)