이 패턴은 상속 대신 합성(composition)을 사용하여 기존 클래스에 새로운 행동을 추가하는 패턴입니다.
1. 주요 개념
- 컴포넌트(Component): 기본 객체의 인터페이스를 정의합니다.
- 구체 컴포넌트(Concrete Component): 기본 객체의 구체적인 구현을 정의합니다.
- 데코레이터(Decorator): 컴포넌트 인터페이스를 구현하며, 컴포넌트 객체를 포함합니다.
- 구체 데코레이터(Concrete Decorator): 추가 기능을 구현하는 데코레이터 클래스입니다.
2. 구조

3. 소스 코드 예시
- 치즈버거에 재료를 추가
1) Component
// 버거
public interface Burger {
void make();
}
2) Concrete Component
// 치즈 버거
public class CheeseBurger implements Burger {
Material material;
public CheeseBurger(){}
public CheeseBurger(Material material) {
this.material = material;
}
public void make(){
System.out.println("치즈버거 생성");
if(material != null) material.add();
}
}
3) Decorator
public interface Material {
void add();
}
4) Concrete Decorator
// 당근 추가
public class Carrot implements Material{
Material material;
public Carrot(Material material){
this.material = material;
}
public Carrot(){}
@Override
public void add() {
System.out.println("당근 추가");
if(material != null){
material.add();
}
}
}
// 햄 추가
public class Ham implements Material{
Material material;
public Ham(Material material){
this.material = material;
}
public Ham(){}
@Override
public void add() {
System.out.println("햄 추가");
if(material != null){
material.add();
}
}
}
// 양배추 추가
public class Cabbage implements Material{
Material material;
public Cabbage(Material material){
this.material = material;
}
public Cabbage(){}
@Override
public void add() {
System.out.println("양배추 추가");
if(material != null){
material.add();
}
}
}
5) Application
public class App {
public static void main(String[] args) {
// 기본 치즈 버거
Burger b1 = new CheeseBurger();
b1.make();
System.out.println("================");
// 당근, 양배추, 햄, 당근 추가한 치즈 버거
Burger b2 = new CheeseBurger(new Carrot(new Cabbage(new Ham(new Carrot()))));
b2.make();
}
}
4. 결과
- 자유로운 재료 추가
- 재료가 추가되는 순서 기록
Share article