Sunday, 29 September 2013

Observer pattern


Here Observable is a Subject, Publisher, Event etc

Observer is listner, Subscriber  etc

Suppose there is a weather station which issues the weather warning . All the TV channels gets the update from this weather station. So weather station is a subject.
And TV channels are the Observer.

public interface Publisher {

      public void addSubscriber(Subscriber subscriber);

      public void removeSubscriber(Subscriber subscriber);

      public void notifySubscribers(String  string);

}

class WeatherStation implements Publisher {

      private String warning;
     
      void releaseWarning(String string) {
            this.warning = string;
            notifySubscribers(warning);
      }
     

      ArrayList<Subscriber> arrayList = new ArrayList<Subscriber>();

      @Override
      public void addSubscriber(Subscriber subscriber) {
            arrayList.add(subscriber);

      }

      @Override
      public void removeSubscriber(Subscriber subscriber) {
            arrayList.remove(subscriber);

      }

      @Override
      public void notifySubscribers(String  string) {
            for (Subscriber s : arrayList) {
                  s.getNotification4mPublisher(string);
            }

      }

}

Now we have a interface Subscriber


interface Subscriber {

      public void getNotification4mPublisher(String string);
}

class AaaTak implements Subscriber {

      @Override
      public void getNotification4mPublisher(String string) {

            System.out.println("AaaTak WEATHER WARNING " + string);

      }

}

class StarNews implements Subscriber {

      @Override
      public void getNotification4mPublisher(String string) {

            System.out.println("StarNews WEATHER WARNING " + string);

      }
}

class ZeeNews implements Subscriber {

      @Override
      public void getNotification4mPublisher(String string) {

            System.out.println("ZeeNews WEATHER WARNING " + string);

      }
}

public class TestObsrverPattern {

      public static void main(String[] args) {

            WeatherStation station = new WeatherStation();

            AaaTak aaaTak = new AaaTak();
            StarNews news = new StarNews();
            ZeeNews news2 = new ZeeNews();

            station.addSubscriber(aaaTak);
            station.addSubscriber(news);
            station.addSubscriber(news2);

            station.notifySubscribers("Heavy rains expected in NEW York");

      }

}





This can also be achieved by Observer class in java.util package

public class WeatherStation extends Observable{
     
      private String warning;

      void releaseWarning(String string) {
            this.warning = string;
         setChanged();    //this is mandatory
       //clearChanged();
            notifyObservers(warning);
      }
     
}

public class StarTV implements Observer {

      @Override
      public void update(Observable subject, Object object) {
            System.out.println(subject.hasChanged() + " --> " + object);
      }

}

class ZeeTv implements Observer {

      @Override
      public void update(Observable subject, Object object) {
            subject.notifyObservers();
            System.out.println(" --> " + object);
      }
}


      public static void main(String[] args) {
           
            WeatherStation weatherStation = new WeatherStation();
ZeeTv ztv = new ZeeTv();
StarTV starTV = new StarTV();
weatherStation.addObserver(ztv);
weatherStation.addObserver(starTV);
weatherStation.releaseWarning("Heavy rains expected in NEW York");
weatherStation.releaseWarning("Heavy rains expected in Minneapolis");
     
}

      

No comments:

Post a Comment