// Carsten Schuermann // Observer Pattern in Java // Someplace on the web import java.util.ArrayList; import java.util.Iterator; public interface Subject { public void addObserver( Observer o ); public void removeObserver( Observer o ); } public interface Observer { public void update( Subject o ); } public class IntegerDataBag implements Subject { private ArrayList list = new ArrayList(); private ArrayList observers = new ArrayList(); public void add( Integer i ) { list.add( i ); notifyObservers(); } public Iterator iterator() { return list.iterator(); } public Integer remove( int index ) { if( index < list.size() ) { Integer i = (Integer) list.remove( index ); notifyObservers(); return i; } return null; } public void addObserver( Observer o ) { observers.add( o ); } public void removeObserver( Observer o ) { observers.remove( o ); } private void notifyObservers() { // loop through and notify each observer Iterator i = observers.iterator(); while( i.hasNext() ) { Observer o = ( Observer ) i.next(); o.update( this ); } } } public class IntegerAdder implements Observer { private IntegerDataBag bag; public IntegerAdder( IntegerDataBag bag ) { this.bag = bag; bag.addObserver( this ); } public void update( Subject o ) { if( o == bag ) { System.out.println( "The contents of the IntegerDataBag have changed." ); int counter = 0; Iterator i = bag.iterator(); while( i.hasNext() ) { Integer integer = ( Integer ) i.next(); counter+=integer.intValue(); } System.out.println( "The new sum of the integers is: " + counter ); } } } public class IntegerPrinter implements Observer { private IntegerDataBag bag; public IntegerPrinter( IntegerDataBag bag ) { this.bag = bag; bag.addObserver( this ); } public void update( Subject o ) { if( o == bag ) { System.out.println( "The contents of the IntegerDataBag have changed." ); System.out.println( "The new contents of the IntegerDataBag contains:" ); Iterator i = bag.iterator(); while( i.hasNext() ) { System.out.println( i.next() ); } } } }