[디자인 패턴] 데코레이터 패턴 (Decorator Pattern)

KangHo Lee's avatar
Nov 13, 2024
[디자인 패턴] 데코레이터 패턴 (Decorator Pattern)
💡
이 패턴은 상속 대신 합성(composition)을 사용하여 기존 클래스에 새로운 행동을 추가하는 패턴입니다.

1. 주요 개념

  • 컴포넌트(Component): 기본 객체의 인터페이스를 정의합니다.
  • 구체 컴포넌트(Concrete Component): 기본 객체의 구체적인 구현을 정의합니다.
  • 데코레이터(Decorator): 컴포넌트 인터페이스를 구현하며, 컴포넌트 객체를 포함합니다.
  • 구체 데코레이터(Concrete Decorator): 추가 기능을 구현하는 데코레이터 클래스입니다.

2. 구조

notion image

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

devleekangho