Saturday, September 27, 2014

Event and Listener

package Event;


import java.io.Console;
import java.util.HashSet;
import java.util.Set;

public class NumberReader {
    private Set<NumberReadListener> listeners;

    public NumberReader() {
        listeners = new HashSet<NumberReadListener>();
    }

    public void addNumberReadListener(NumberReadListener listener) {
        this.listeners.add(listener);
    }

    public void removeNumberReadListener(NumberReadListener listener) {
        this.listeners.remove(listener);
    }

    public void start() {
        Console console = System.console();
        if (console != null) {
            Double d = null;
            do {
                String readLine = console.readLine("Enter a number: ", (Object[])null);
                d = getDoubleValue(readLine);
                if (d != null) {
                    notifyListeners(d);
                }
            } while (d != null);
            notifyListenersOfEndOfStream();
        }
    }

    private void notifyListenersOfEndOfStream() {
        for (NumberReadListener numberReadListener: listeners) {
            numberReadListener.numberStreamTerminated(new NumberReadEvent(this, 0D));
        }
    }

    private void notifyListeners(Double d) {
        for (NumberReadListener numberReadListener: listeners) {
            numberReadListener.numberRead(new NumberReadEvent(this, d));
        }
    }

    private Double getDoubleValue(String readLine) {
        Double result;
        try {
            result = Double.valueOf(readLine);
        } catch (Exception e) {
            result = null;
        }
        return result;
    }
}


package Event;

import java.util.EventObject;


public class NumberReadEvent extends EventObject {

    private Double number;

    public NumberReadEvent(Object source, Double number) {
        super(source);
        this.number = number;
    }

    public Double getNumber() {
        return number;
    }
}

package Event;


import java.util.EventListener;

public interface NumberReadListener extends EventListener {
    public void numberRead(NumberReadEvent numberReadEvent);

    public void numberStreamTerminated(NumberReadEvent numberReadEvent);
}


package Event;


public class NumberReadListenerImpl implements NumberReadListener {

    Double totalSoFar = 0D;

    @Override
    public void numberRead(NumberReadEvent numberReadEvent) {
        totalSoFar += numberReadEvent.getNumber();
    }

    @Override
    public void numberStreamTerminated(NumberReadEvent numberReadEvent) {
        System.out.println("Sum of the number stream: " + totalSoFar);
    }
}


package Event;


public class Main {

    public static void main(String[] args) {
        NumberReader reader = new NumberReader();
        NumberReadListener listener = new NumberReadListenerImpl();
        reader.addNumberReadListener(listener);
        reader.start();
    }
}

No comments:

Post a Comment