반응형

구조 패턴 - Decorator

 

해결하려는 문제

  • 기존 객체 수정없이 새로운 책임을 추가하고 싶을 때

 

 

public class Main {
    public static void main(String[] args) {
        Beverage water = new Water();
        water.printPrice();
        
        Beverage milk = new Milk();
        milk.printPrice();
        
        Beverage espresso = new Espresso();
        espresso.printPrice();
        
        Beverage americano = new Americano(espresso, water);
        americano.printPrice();
        
        Beverage caffeLatte = new CaffeLatte(espresso, milk);
        caffeLatte.printPrice();
        
        Beverage caffeMocha = new CaffeMocha(caffeLatte, 500);
        caffeMocha.printPrice();
    }
}
public interface Beverage {
    String getName();
    int getPrice();
    
    default void printPrice() {
        Systemo.out.println(getName() + "의 가격은 " + getPrice() + "원");
    }
}
public class Water implements Beverage {
    @Override
    public String getName() {
        return "물";
    }

    @Override
    public int getPrice() {
        return 1000;
    }
}
public class Milk implements Beverage {
    @Override
    public String getName() {
        return "우유";
    }

    @Override
    public int getPrice() {
        return 1500;
    }
}
public class Espresso implements Beverage {
    @Override
    public String getName() {
        return "에스프레소";
    }

    @Override
    public int getPrice() {
        return 2000;
    }
}
public class Americano implements Beverage {
    private Beverage espresso;
    private Beverage water;
    
    public Americano(Beverage espresso, Beverage water) {
         this.espresso = espresso;
         this.water = water;
    }
    
    @Override
    public String getName() {
        return "아메리카노";
    }
    
    @Override
    public int getPrice() {
        return espresso.getPrice() + water.getPrice();
    }
}
public class CaffeLatte implements Beverage {
    private Beverage espresso;
    private Beverage milk;
    
    public CaffeLatte(Beverage espresso, Beverage milk) {
         this.espresso = espresso;
         this.milk = milk;
    }
    
    @Override
    public String getName() {
        return "카페라떼";
    }
    
    @Override
    public int getPrice() {
        return espresso.getPrice() + milk.getPrice();
    }
}
public class CaffeMocha implements Beverage {
    private Beverage caffeLatte;
    private int syrupPrice;
    public CaffeMocha(Beverage caffeLatte, int syrupPrice) {
         this.caffeLatte = caffeLatte;
         this.syrupPrice = syrupPrice;
    }
    
    @Override
    public String getName() {
        return "카페모카";
    }
    
    @Override
    public int getPrice() {
        return caffeLatte.getPrice() + syrupPrice;
    }
}

 

 


반응형

+ Recent posts