public class ObserverDemo {
    public static void main(String[] args) {
        Thermometer fridge = new Thermometer("refri 1");
        ColdChainAlarm alarm = new ColdChainAlarm();
        fridge.addListener(new Display());
        fridge.addListener(alarm);
        fridge.addListener(reading -> {             // un observer también puede ser una lambda
            if (reading.celsius() > 7.5) {
                IO.println("  (aviso: cerca del límite)");
            }
        });

        fridge.record(4.5);
        fridge.record(7.8);
        fridge.record(9.1);
        IO.println("alarmas: " + alarm.alerts());

        // Darse de baja durante la notificación.
        Thermometer safe = new Thermometer("refri 2");
        safe.addListener(new FirstAlert(safe, 8.0));
        safe.addListener(new Display());
        safe.record(8.5);
        safe.record(9.0);

        NaiveThermometer naive = new NaiveThermometer("refri 3");
        naive.addListener(new FirstAlert(naive, 8.0));
        naive.addListener(new Display());
        naive.addListener(new ColdChainAlarm());
        try {
            naive.record(8.5);
        } catch (RuntimeException e) {
            IO.println("ingenuo: " + e);
        }
    }
}
