Spring

Decorator pattern(데코레이터 패턴)

테니드2 2021. 4. 18. 07:43

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

SOLID중에서 개방패쇄 원칙과 의존 역전 원칙을 따른다.

 

 

- 실습

package com.company.gof.decorator;

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

 

package com.company.gof.decorator;

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.gof.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());
    }
}

 

 

package com.company.gof.decorator;

public class A3 extends AudiDecorator {

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

 

package com.company.gof.decorator;

public class A4 extends AudiDecorator {

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

 

 

package com.company.gof.decorator;

public class A5 extends AudiDecorator {

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

 

package com.company.gof;

import com.company.gof.decorator.*;


public class Main {

    public static void main(String[] args) {

        ICar audi = new Audi(1000);
        audi.showPrice();

        ICar audi3 = new A3(audi, "A3");
        audi3.showPrice();

        ICar audi4 = new A4(audi, "A4");
        audi4.showPrice();

        ICar audi5 = new A5(audi, "A5");
        audi5.showPrice();

    }

}

 

- 결과 화면