package cgeo.geocaching.utils; import java.util.LinkedHashSet; import java.util.Set; /** * Synchronized implementation of the {@link ISubject} interface. * * @param * the kind of data to observe */ public class Subject implements ISubject { /** * Collection of observers. */ protected final Set> observers = new LinkedHashSet>(); @Override public synchronized boolean addObserver(final IObserver observer) { final boolean added = observers.add(observer); if (added && observers.size() == 1) { onFirstObserver(); } return added; } @Override public synchronized boolean deleteObserver(final IObserver observer) { final boolean removed = observers.remove(observer); if (removed && observers.isEmpty()) { onLastObserver(); } return removed; } @Override public synchronized boolean notifyObservers(final T arg) { final boolean nonEmpty = !observers.isEmpty(); for (final IObserver observer : observers) { observer.update(arg); } return nonEmpty; } @Override public synchronized int sizeObservers() { return observers.size(); } @Override public synchronized boolean clearObservers() { final boolean nonEmpty = !observers.isEmpty(); for (final IObserver observer : observers) { deleteObserver(observer); } return nonEmpty; } /** * Method called when the collection of observers goes from empty to non-empty. *

* The default implementation does nothing and may be overwritten by child classes. */ protected void onFirstObserver() { } /** * Method called when the collection of observers goes from non-empty to empty. *

* The default implementation does nothing and may be overwritten by child classes. */ protected void onLastObserver() { } }