import javax.swing.JOptionPane;
import java.text.NumberFormat;
import java.util.Locale;


public class TestCoffeeShop2 {
    
    public TestCoffeeShop2() {
        DrinkItem aDrink;
        aDrink = new Addition(new Drink("coffee",1.50),"cream",0.50);
        display(aDrink);
        aDrink = new Drink("coffee",1.00);
        aDrink = new Addition(aDrink,"cream",0.50);
        aDrink = new Addition(aDrink,"sugar",0.75);
        aDrink = new Addition(aDrink,"lemon",0.25);
        display(aDrink);
        aDrink = new Addition(new Drink("tea",1.00),"cream",0.50);
        display(aDrink);
        aDrink = new Drink("coffee",1.50);
        display(aDrink);
    } // end TestCoffeeShop2
    
    public void display(DrinkItem d) {
        NumberFormat money = NumberFormat.getCurrencyInstance(Locale.US);
        String out = "Your drink is " + d.getDescription();
        out += "\nThe cost is " + money.format(d.getCost());
        JOptionPane.showMessageDialog(null,out);
    }    
    
    interface DrinkItem {
        public double getCost();
        public String getDescription();
    }// end DrinkItem
    
    class Drink implements DrinkItem {
        private String drinkType;
        private double drinkCost;
        
        public Drink(String type, double cost) {
            drinkType = type;
            drinkCost = cost;
        } // end Drink
        
        public double getCost() {
            return drinkCost;
        }
        
        public String getDescription() {
            return drinkType;
        }
    }// end Drink
    
    class Decorator implements DrinkItem {
        private DrinkItem drink;
        
        public Decorator(DrinkItem drink) {
            this.drink = drink;
        }
        public DrinkItem getDrinkItem() {
            return drink;
        }
        public double getCost() {
            return drink.getCost();
        }
        public String getDescription() {
            return drink.getDescription();
        }
    }// end Decorator
    
    class Addition extends Decorator {
        private String additionType;
        private double additionCost;
        
        public Addition(DrinkItem d, String type, double cost) {
            super(d);
            additionType = type;
            additionCost = cost;
        }
        public double getCost() {
            return getDrinkItem().getCost() + additionCost;
        }
        public String getDescription() {
            return getDrinkItem().getDescription() + " with " + additionType;
        }
    }// end Addition
    
    public static void main(String[] args) throws Exception {
        new TestCoffeeShop2();
        System.exit(0);
    }
} // end TestCoffeeShop2

