/** Context: calcula el total de una compra con la tarifa que se le dé. */
public class Checkout {
    private ShippingRate rate;

    public Checkout(ShippingRate rate) {
        this.rate = rate;
    }

    /** La strategy se puede cambiar mientras el programa corre. */
    public void setRate(ShippingRate rate) {
        this.rate = rate;
    }

    public Money total(Parcel parcel) {
        return parcel.subtotal().plus(rate.cost(parcel));
    }
}
