inblog logo
|
devleekangho
    용어정리

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

    KangHo Lee's avatar
    KangHo Lee
    Nov 13, 2024
    [디자인 패턴] 데코레이터 패턴 (Decorator Pattern)
    Contents
    1. 주요 개념2. 구조3. 소스 코드 예시4. 결과
    💡
    이 패턴은 상속 대신 합성(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
    Contents
    1. 주요 개념2. 구조3. 소스 코드 예시4. 결과

    devleekangho

    RSS·Powered by Inblog