package org.softlang.company.features.util; import java.util.*; /** * Compose the (Simple)List interface with the Observable base class. * In fact, a given list is decorated with observer capability. * The methods must be adjusted to notify upon changes. * Addition and removal of observers is pushed into elements--if they are observable. */ public class ObservableSimpleList<X> extends Observable implements SimpleList<X> { private SimpleList<X> inner; public ObservableSimpleList(SimpleList<X> inner) { this.inner = inner; } // // // Methods of the Observable interface are overridden. // // public void addObserver(Observer o) { super.addObserver(o); for (X e : this) if (e instanceof Observable) ((Observable)e).addObserver(o); } public void deleteObserver(Observer o) { super.deleteObserver(o); for (X e : this) if (e instanceof Observable) ((Observable)e).deleteObserver(o); } public void deleteObservers() { super.deleteObservers(); for (X e : this) if (e instanceof Observable) ((Observable)e).deleteObservers(); } // // // Beyond this point, the SimpleList interface is implemented // // public Iterator<X> iterator() { return inner.iterator(); } public boolean add(X e) { boolean result = inner.add(e); if (result) { setChanged(); notifyObservers(new AddToList(e)); } return result; } public boolean remove(X e) { boolean result = inner.remove(e); if (result) { setChanged(); notifyObservers(new RemoveFromList(e)); } return result; } }