Version 2
    /*
     * JBoss, the OpenSource J2EE webOS
     * 
     * Distributable under LGPL license.
     * See terms of license at gnu.org.
     */
    package org.jboss.aop.patterns.observable;
    
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    /**
     * The subject implementation.
     * 
     * @author <a href="adrian@jboss.com">Adrian Brock</a>
     * @version $Revision: 1.1 $
     */
    public class SubjectImpl implements Subject
    {
       /** The observers */
       private Set observers = Collections.synchronizedSet(new HashSet());
       
       /** The subject */
       private Object subject;
    
       public SubjectImpl(Object subject)
       {
          this.subject = subject;
       }
       
       public void addObserver(Observer observer)
       {
          observers.add(observer);
       }
       
       public void removeObserver(Observer observer)
       {
          observers.remove(observer);
       }
       
       public void notifyObservers()
       {
          Subject obj = (Subject) subject;
          
          synchronized (observers)
          {
             for (Iterator i = observers.iterator(); i.hasNext();)
             {
                Observer observer = (Observer) i.next();
                observer.fireChange(obj);
             }
          }
       }
    }