// Observer design pattern // 1. "Nezavisnu" funkcionalnost modelujmo "subject" apstrakcijom // 2. "Zavisnu" funkcionalnost modelujmo "observer" hierarhijom // 3. Subject je u vezi jedino sa osnovnom Observer klasom // 4. Observeri obavljaju registrovanja (sa Subject) // 5. Subject prenosi dogadjanja do svih registrovanih Observera // 6. Observeri "potiskuju" informaciju koja im je potrebna od Subject // 7. Klijent konfigurise broj tip Observera class Subject { // 1. "Nezavisnost" private Observer[] observers = new Observer[9]; // 3.Veza ka osnovnoj Observer klasi private int totalObs = 0; private int state; public void attach( Observer o ) { observers[totalObs++] = o; } // 3.Vezano /* getState, setState - uporedite sa dijagramom prikaza u DP6.htm*/ public int getState() { return state; } public void setState( int in ) { state = in; notifyObservers(); } private void notifyObservers() { for (int i=0; i < totalObs; i++) observers[i].update(); // 3.Veza ka osnovnoj klasi } } //5. Prenos dogadjaja do observera abstract class Observer { // 2.Koren "zavisne" hierarhije protected Subject subj; public abstract void update(); } class HexObserver extends Observer { // 2. Klasa "zavisne" hijerarhije public HexObserver( Subject s ) { subj = s; subj.attach( this ); } // 4. Observeri se registruju (sa Subject) public void update() { System.out.print( " " + Integer.toHexString( subj.getState() ) ); } } // 6. Observeri "potiskuju" informaciju koja im je potrebna od Subject class OctObserver extends Observer { //2. Klasa "zavisne" hijerarhije public OctObserver( Subject s ) { subj = s; subj.attach( this ); } //4.Observeri se registruju public void update() { System.out.print( " " + Integer.toOctalString( subj.getState() ) ); } } // 6. Observeri "potiskuju" informaciju class BinObserver extends Observer { //2. Klasa "zavisne" hijerarhije public BinObserver( Subject s ) { subj = s; subj.attach( this ); } // 4. Observeri se registruju public void update() { System.out.print( " " + Integer.toBinaryString( subj.getState() ) ); } } //6.Observeri "potiskuju" informaciju public class ObserverPrimer1 { public static void main( String[] args ) { Subject sub = new Subject(); // 7. Klijent konfigurise Observere new HexObserver( sub ); new OctObserver( sub ); new BinObserver( sub ); System.out.print( "Ako je broj 15 onda: " ); sub.setState( 15); } }