: 객체의 결합 을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴

  • 기본 뼈대(클래스)는 유지하되, 이후 필요한 형태로 꾸밀 때 사용한다.
  • 확장의 필요한 경우 상속의 대안으로 사용한다
  • SOLID에 OCP, DIP를 따른다.

Decorator Pattern 테이블

<img width=450px src=./img/decorator-pattern-table.png>

Decorator Pattern의 적용

요구사항

  • ICar interface를 상속받아 Audi차를 여러모댈로 나눠 만들어라
  • ICar에는 getPrice(), showCost() 가 선언되어있다.

1. Decorator Pattern의 적용 전

선언과 기능의 분리를 위해 ICar 인터페이스 생성

public interface ICar {
    int getPrice();
    void showCost();
}

Audi 차를 만들기위한 기본 class 생성

public class Audi implements ICar{

    private int cost;

    public Audi(int cost){
        this.cost = cost;
    }

    @Override
    public int getPrice(){
        return this.cost;
    }
    @Override
    public void showCost() {
        System.out.println("Audi Base는 "+cost+" 원 입니다.");
    }
}

결과

public class main{
    public sstatic void main(String[] args){
        ICar audi = new Audi(1000);
        audi.showPrice(); // 출력: Audi Base는 1000 원 입니다.

    }
}
  • 우리는 여러 모델의 아우디 Car를 만들어야 된다.
  • 여러 모델 class에 바로 ICar를 상속받아 여러 모델의 클래스를 만들수 있지만 Decorator Pattern을 이용여 모델을 추가할 것이다.
  • 여러 모델(a3, a4, a5)는 모델값(modelPrice)이 기본값에서 추가된다.

1. Decorator Pattern의 적용 후

Decorator Pattern을 사용하기 위한 AudiModelDecorator class 만들기

public class AudiModelDecorator implements ICar{

    protected ICar audi;
    protected int modelPrice;

    public AudiModelDecorator(ICar audi){
        this.audi = audi;
    }

    @Override
    public int getPrice() {
        return audi.getPrice();
    }

    @Override
    public void showCost() {
        System.out.println("가격은 "+(audi.getPrice()+modelPrice)+" 만원 입니다");
    }

여러 모델class 선언하기

public class A3 implements AudiModelDecorator{

    public A3(ICar audi) {
        super(audi);
        this.modelPrice = 1000;
    }
}

public class A4 extends AudiModelDecorator {
    public A4(ICar audi) {
        super(audi);
        this.modelPrice = 2000;
    }
}

public class A5 extends AudiModelDecorator {

    public A5(ICar audi) {
        super(audi);
        this.modelPrice = 3000;
    }
}

결과

public class Main{
    public static void main(){

        ICar audi = new Audi(1000);
        audi.showCost(); // 출력: Audi Base는 1000 원 입니다.

        ICar audi3 = new A3(audi);
        audi3.showCost(); // 출력: A3의 가격은 2000 원 입니다.

        ICar audi4 = new A4(audi);
        audi4.showCost(); // 출력: A4의 가격은 3000 원 입니다.

        ICar audi5 = new A5(audi);
        audi5.showCost(); // 출력: A5의 가격은 4000 원 입니다.
    }
}