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;
}
}
반응형
댓글