데코레이터 패턴(Decorator Pattern - java)

박민주·2024년 1월 8일
0

기존 뼈대는 유지하되 필요한 형태로 꾸밀때 사용한다. 확장이 필요한 경우 상속의 대안으로도 활용한다. SOLID중에서 개방폐쇄 원칙(OCP)과 의존 역전 원칙 (DIP)를 따른다.
ex ) 에스프레소 + 물 = 아메리카노, 에스프레소 + 우유 = 라떼
커피원액에서 다른게 첨가되면서 다른형태로 바뀌는것.

역할이 수행하는 작업

  • Class
    기본 기능을 뜻하는 ConcreteComponent와 추가 기능을 뜻하는 Decorator의 공통 기능을 정의. 즉, 클라이언트는 Component를 통해 실제 객체를 사용함
  • ConcreteClass
    기본 기능을 구현하는 클래스
  • Decorator
    많은 수가 존재하는 구체적인 Decorator의 공통 기능을 제공
  • ConcreteDecorator
    Decorator의 하위 클래스로 기본 기능에 추가되는 개별적인 기능을 뜻함

코드 예시

Class

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

ConcreteClass

public class Audi implements ICar {

    private int price;

    public Audi(int price) {
        this.price = price;
    }
    @Override
    public int getPrice() {
        return price;
    }

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

Decorator

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;
    }

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

ConcreteDecorator

public class A3 extends AudiDecorator{
    public A3(ICar audi, String modelName) {
        super(audi, modelName, 1000);
    }
}

public class A4 extends AudiDecorator{
    public A4(ICar audi, String modelName) {
        super(audi, modelName, 2000);
    }
}

public class A5 extends AudiDecorator{
    public A5(ICar audi, String modelName) {
        super(audi, modelName, 3000);
    }
}

실행

public class Main {
    public static void main(String[] args) {
        ICar audi = new Audi(1000);
        audi.showPrice();

        // a3
        ICar audi3 = new A3(audi, "A3");
        audi3.showPrice();
        // a4
        ICar audi4 = new A4(audi, "A4");
        audi4.showPrice();
        // a5
        ICar audi5 = new A5(audi, "A5");
        audi5.showPrice();
    }
}

참고

https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html

profile
개발자 되고싶다..

0개의 댓글