package normeDeCodage.vue.swing;

import java.util.Observable;
import java.util.Observer;

public class ObserverPattern {
	/*
	 * le pattern de l'observateur imite le 
	 * fonctionnement d'un abonnement à un journal
	 * 
	 * dans le cas d'une application swing,
	 * il arrive souvent qu'un formulair fasse apparaitre 
	 * un autre formulaire et attendent les données de ce
	 * dernier (que l'utilisateur termine et appuis sur ok)
	 * pour continuer
	 * 
	 * l'observable est un objet qui EXTEND Observable
	 * et à qui il arrive des changement non controlé,
	 * les méthode addObserver() deleteObserver()
	 * permette à un observer de s'ajouter. Au moment du
	 * changement , l'observable doit executer setChanged() et
	 * ensuit, notifyObservers();
	 * 
	 * l'observer est un objet qui IMPLEMENT Observer
	 * il surcharge la méthode update() où l'on
	 * peut coder les réactions à un changement de
	 * l'observable
	 * */
	
	public static class ExempleObservable extends Observable{
		public void yo(){
			setChanged();
			notifyObservers(null);
		}
	}
	
	public static class ExempleObserver implements Observer{
		@Override
		public void update(Observable arg0, Object arg1) {
			System.out.println("yo");
		}
	}
	
	public static void main(String ... args){
		ExempleObservable observable = new ExempleObservable();
		@SuppressWarnings("unused")
		ExempleObserver observerA = new ExempleObserver(),
				        observerB = new ExempleObserver();
		
		observable.addObserver(observerA);
		observable.yo();
		//should print yo
		System.out.println("yeah");
	}
}
