본문 바로가기
Spring/DesighPattern

GOF패턴 - Decorator(구조)

by windy7271 2023. 3. 22.
728x90
반응형

Decorator : 동적으로 책임추가가 필요할때 데코레이터 패턴 사용

 

 

Component : 실질적인 인스턴스를 컨트롤 하는 역할 >> 데코레이터와 컨크리트를 컨트롤한다

ConcreteComponent : Component 의 실직적인 인스턴스 부분 책임의주체 역할 Component 가 컨트롤 하는 객체 책임구현 실체화

Decorator : Component 와 Concrete Decorator 를 동일시 하도록 해주는 역할 Component가 되면서 가지고 있다.

Concrete Decorator : 실질적인 장식 인스턴스이며 추가된 책임의 주체 부분 

 

 

package DecoratorPattern.abst;

public interface IBeverage {

    // 총 가격에 대해 책임을 묻는 부분
    int getTotalPrice();
}

 

Base : ibeverage 에 대한 구체적인 부분

package DecoratorPattern.concrete;
import DecoratorPattern.abst.IBeverage;

public class Base implements IBeverage {
    @Override
    public int getTotalPrice() {
        return 0;
    }
}

 

책임의 주체이다.

아무것도 시키지 않으면 0원 이기 때문에 0 으로 기본값 지정

 

AbstAdding 동일시 하는 부분 

package DecoratorPattern.abst;

abstract public class AbstAdding implements IBeverage {

    private IBeverage base;

    public AbstAdding(IBeverage base) {
        super();
        this.base = base;
    }

    @Override
    public int getTotalPrice() {
        return base.getTotalPrice();
    }

    protected IBeverage getBase() {
        return base;
    }
}

 

사용자가 보기에는 iBeverage 로 보인다.

 

 

concrete 구체화

package DecoratorPattern.concrete;

import DecoratorPattern.abst.AbstAdding;
import DecoratorPattern.abst.IBeverage;

public class Espresso extends AbstAdding {

    static protected int espressoCount = 0;

    public Espresso(IBeverage base) {
        super(base);
    }

    @Override
    public int getTotalPrice() {
        return super.getTotalPrice()+getAddPrice();
    }

    /**
     * 에스프레소 추가가격
     * @return
     */
    private static int getAddPrice(){
        espressoCount +=1;
        int addPrice = 100;

        if(espressoCount > 1){
            addPrice = 70;
        }
        return addPrice;
    }

}
package DecoratorPattern.concrete;

import DecoratorPattern.abst.AbstAdding;
import DecoratorPattern.abst.IBeverage;

public class Milk extends AbstAdding {

    public Milk(IBeverage meterial) {
        super(meterial);
    }

    @Override
    public int getTotalPrice() {
        return super.getTotalPrice()+50;
    }

}
반응형

댓글