5. 데코레이터 Decorator Pattern 개념 및 실습

Yeppi's 개발 일기·2022년 5월 13일
0

디자인패턴

목록 보기
5/8
post-thumbnail

1. 개념

기능 추가 확장

  • 기존 클래스(뼈대)는 유지하고, 필요한 형태로 추가적으로 꾸밀 때 사용

  • 확장이 필요한 경우 → 상속의 대안으로 활용

  • SOLID 중 개방 폐쇄 원칙(OCP), 의존 역전 원칙(DIP)


2. 실습

  • 아우디라는 자동차 브랜드가 차 레벨에 따라 가격을 추가한다

  • 상위 레벨로 올라 갈수록 가격을 추가되는 것을 데코레이터 패턴으로 구현


차 가격 인터페이스

  • 전체 모든 자동차 >>> 아우디, 벤츠, BMW 등등...

  • 어떤 브랜드의 자동차더라도 가격은 존재하기 때문에, 자동차의 가격을 인터페이스로 추상화

  • ICar

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

아우디의 기본 뼈대 구성

  • 아우디 브랜드의 가격을 설정할 수 있는 메서드 작성

  • Audi

// 기본 뼈대 구조
public class Audi implements ICar{

    private int price;

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

    @Override
    public int getPrice() {
        return 0;
    }

    @Override
    public void showPrice() {
        System.out.println("audi 의 가격은 " + this.price + "원 입니다.");
    }
}

아우디 레벨별로 가격 추가 - 데코레이터

  • 각 레벨 클래스에 일정 가격을 추가

  • AudiDecorator

public class AudiDecorator implements ICar {
    protected ICar audi;
    protected String modelName;
    protected int modelPrice;

    public  AudiDecorator(ICar audi, String modelName, int modelPrice) {
        this.audi = audi;
        this.modelName = modelName;
        this.modelPrice = modelPrice;
    }

    @Override
    public int getPrice() {
        return audi.getPrice() + modelPrice; // A3, A4, A5 등급별로 가격 상승(+modelPrice)
    }

    @Override
    public void showPrice() {
        System.out.println(modelName + "의 가격은 " + getPrice() +"원 입니다.");
    }
}

각 레벨 클래스

  • 데코레이터를 상속받음

  • A3

public class A3 extends AudiDecorator{
    public A3(ICar audi, String modelName) {
        super(audi, modelName, 1000);
    }
}
  • A4
public class A4 extends AudiDecorator{
    public A4(ICar audi, String modelName) {
        super(audi, modelName, 2000);
    }
}
  • A5
public class A5 extends AudiDecorator{
    public A5(ICar audi, String modelName) {
        super(audi, modelName, 3000);
    }
}

출력 결과

  • 1000, 2000, 3000 이 레벨별로 잘 출력
        ICar audi = new Audi(1000);
        audi.showPrice();
        
        // 기존 가격에서 등급을 하나씩 추가하는 decorator
        
        // a3
        ICar audi3 = new A3(audi, "A3");
        audi3.showPrice(); // 1000
        
        // a4
        ICar audi4 = new A4(audi, "A4");
        audi4.showPrice(); // 2000
        
        // a5
        ICar audi5 = new A5(audi, "A5");
        audi5.showPrice(); // 3000
profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글