Back-end/JavaSpringBoot

데코레이터 패턴

본투비곰손 2022. 8. 3. 00:17
728x90

기존 클래스는 유지하되, 이후 필요한 형태로 꾸밀대 사용한다. 확장이 필요한 경우 상속의 대안으로도 활용한다. 

SOLID중 개방 폐쇄의 원칙과 의존 역전 원칙을 따른다

차량의 가격을 가져오고 보여주는 인터페이스 생성

package com.company.design.dedorator;

public interface ICar {

    int getPrice();
    void showPrice();
}

인터페이스를 상속받은 기본클래스( 자동차)를 생성 및 가격을 정해준다.

package com.company.design.dedorator;

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+"원 입니다.");
    }
}

인터페이스를 상속받아 기본 차량의 가격을받아오고 가격을 보여주는 데코레이터 클래스 생성

package com.company.design.dedorator;

public class NewAudiDecorator implements ICar{

    protected ICar audi;
    protected String modelName;
    protected int modelPrice;

    public NewAudiDecorator(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()+"원 입니다.");
    }
}

차량의 종류에 따른 가격을 설정해준다. 이때 extends를 사용하여 데코레이터를 적용 시켜 준다.

package com.company.design.dedorator;

public class A3 extends NewAudiDecorator{
    public A3(ICar audi, String modelName) {
        super(audi, modelName,1000);
    }
}
package com.company.design.dedorator;

public class A4 extends NewAudiDecorator{
    public A4(ICar audi, String modelName) {
        super(audi, modelName,2000);
    }
}
package com.company.design.dedorator;

public class A5 extends NewAudiDecorator{
    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();
        // 45
        ICar audi5 = new A5(audi, "A5");
        audi5.showPrice();

    }
}
728x90