public class Noeud 
{
	private String 	nom	; 		
	private int 	valeur  ;
	private int 	capacite ;

	
	/**
	 * initialise le Noeud courant avec unNom, uneValeur et unCoefficient
	 * @param uneValeur
	 * @param unCoefficient
	 */
	public Noeud(String unNom, int uneValeur, int uneCapacite) 
	{
		this.setNom(unNom);
		this.setValeur(uneValeur);
		this.setCapacite(uneCapacite);
	}


	/** recupere le nom du Noeud
	 * 
	*/
	public String getNom() 
	{
		return this.nom ;
	}
	
	/**
	 *  unNom devient le nom du Noeud
	 */
	public void setNom(String unNom)
	{
		this.nom = unNom ;
	}
	
	
	
	/** recupere la valeur du Noeud 
	 * 
	*/
	public int getValeur() 
	{
		return this.valeur ;
	}
	
	/**
	 * 
	 */
	public void setValeur(int uneValeur)
	{
		this.valeur = uneValeur ;
	}
	
	
	/**
	 * 
	 */
	public int getCapacite()
	{
		return this.capacite ;
	}
	
	/**
	 * 
	 */
	public void setCapacite(int unCoefficient)
	{
		this.capacite = unCoefficient ;
	}
	
	
	/**
	 *   retourne le String decrivant le Noeud
	 */
	public String toString()
	{
		return "(" + this.getNom() + ", "  + this.getValeur() + ", " +
			         this.getCapacite() + ")" ;
	}
	
	/**
	 * met a jour la valeur du Noeud courant en fonction de v
	 * @param v
	 */
	public void majValeur(int v)
	{
		this.setValeur(this.getValeur() + v * this.getCapacite()) ;
	}
	
}
// fin classe Noeud
/**
 * @author dominique
 * gere un sujet dans le cadre du design pattern Observateur
 */
public interface Sujet 
{
	public abstract void enregistrerObservateur(Observateur o) ;
	
	public abstract void supprimerObservateur(Observateur o) ;
	
	public abstract void notifierObservateurs() ;
}
// fin interface Sujet
import java.util.ArrayList ;

/**
 * @author dominique
 *
 */
public class NoeudSujet extends Noeud implements Sujet 
{
	private ArrayList<Observateur> observateurs ; 
	
	
	/**
	 * 		initialise le NoeudSujet avec uneValeur et unCoefficient
	 * 		et pas d'observateur
	 */
	public NoeudSujet(String unNom, int uneValeur, int unCoefficient) 
	{
		super(unNom, uneValeur, unCoefficient) ;
		this.observateurs = new ArrayList<Observateur>() ;
	}
	
	
	public void enregistrerObservateur(Observateur o) 
	{
		this.observateurs.add(o) ;
	}
	
	
	public void supprimerObservateur(Observateur o)
	{
		this.observateurs.remove(o) ;
	}
	
	
	public void notifierObservateurs()
	{
		for(int i = 0 ; i < this.observateurs.size(); i++)
		{
			this.observateurs.get(i).actualiser(this.getValeur());
		}
	}
	
	
	/**
	 * 	on utilise uneValeur pour modifier la valeur du NoeudSujet
	 */
	public void changementValeur(int uneValeur)
	{
		this.majValeur(uneValeur) ;
		this.notifierObservateurs() ;
	}
	
}
// fin classe NoeudSujet
/**
 * 
 */

/**
 * @author dominique
 * gere un Observateur dans le cadre de design pattern Observateur
 */
public interface Observateur 
{
	/** actualise la valeur de l'Observateur
	 * 
	 * @param valeur
	 */
	public abstract void actualiser(int uneValeur) ;
}
// fin interface Observateur

/**
 * @author Dominique Bouthinon
 *
 */
public class NoeudObservateur extends Noeud implements Observateur
{
	

	/**
	 * initialise le NoeudObservateur avec unNom, uneValeur et unCoefficient
	 * et l'initialise avec uneValeur et unCoefficient
	 */
	public NoeudObservateur(Sujet s, String unNom, int uneValeur, int unCoefficient) 
	{
		super(unNom, uneValeur, unCoefficient) ;
		s.enregistrerObservateur(this) ;
	}

	
	/**
	 *  met a jour le NoeudObservateur avec uneValeur
	 *  et affiche le noeud a jour
	 */
	public void actualiser(int uneValeur)
	{
		this.majValeur(uneValeur);
	}
	
}
// fin classe NoeudObservateur 
import java.util.ArrayList ;


/**
 * @author dominique
 * teste les Noeuds pour faire un Graph (avec le design Pattern Observateur)
 *
 */
public class TestObservateur 
{

	public static void main(String[] args) 
	{
		
								// question 1) 
		
		NoeudSujet  n0 = new NoeudSujet("n0", 0, 2) ;
		Observateur n1 = new NoeudObservateur(n0, "n1", 0, 1) ;
		Observateur n2 = new NoeudObservateur(n0, "n2", 0, 4) ;
		Observateur n3 = new NoeudObservateur(n0, "n3", 0, 5) ;
		
		System.out.println(n0) ;
		System.out.println(n1) ;
		System.out.println(n2) ;
		System.out.println(n3) ;
		System.out.println() ;
		
		n0.changementValeur(1) ;
		
		System.out.println()   ;
		System.out.println(n0) ;
		System.out.println(n1) ;
		System.out.println(n2) ;
		System.out.println(n3) ;
		
	}
	
}
// fin classe TestObservateur