// Observer design pattern //Nasledjivanje klase /nasledjivanje interfejsa // SensorSystem je "subject"(model,izvor). Osvetljenje, Kolo, Pregled su // "views"(posmatraci,pogledi). "Subject" je vezan samo za // "apstrakciju" AlarmListener. // Klasa objekta definise kako se objekat implementira. //Klasa definise unutrasnje stanje objekta,implementaciju njegovih operacija. // Ali, tip objekta se odnosi samo na njegov interface-skup zahteva na koji moze da odgovori. //Nasledjivanje klase definise implementaciju objekta //preko implementacije drugog objekta. //Nasledjivanje interfejsa(odn. pravljenje podtipova) //opisuje situaciju kada jedan objekat moze da se koristi umesto drugog objekta interface AlarmListener { public void alarm(); } class SensorSystem { private java.util.Vector listeners = new java.util.Vector(); public void register( AlarmListener al ) { listeners.addElement( al ); } public void soundTheAlarm() { for (java.util.Enumeration e=listeners.elements(); e.hasMoreElements(); ) ((AlarmListener)e.nextElement()).alarm(); } } class Osvetljenje implements AlarmListener { public void alarm() { System.out.println( "svetlo ukljuceno" ); } } class Kolo implements AlarmListener { public void alarm() { System.out.println( "kolo zatvoreno" ); } } class CheckList { public void byTheNumbers() { //design pattern: Template Method localize(); isolate(); identify(); } protected void localize() { System.out.println( " odrediti perimeter" ); } protected void isolate() { System.out.println( " izolovati mrezu" ); } protected void identify() { System.out.println( " identifikovati izvor" ); } } // nasledjivanje klasa // nasledjivanje interfejsa class Pregled extends CheckList implements AlarmListener { public void alarm() { System.out.println( "Pregled po brojevima:" ); byTheNumbers(); } protected void isolate() { System.out.println( " uperiti kameru" ); } } public class ObserverPrimer2 { //Class nasuprot Interface public static void main( String[] args ) { SensorSystem ss = new SensorSystem(); ss.register( new Kolo() ); ss.register( new Osvetljenje() ); ss.register( new Pregled() ); ss.soundTheAlarm(); } }