Saturday, 23 April 2016

Observer design pattern

Observer design pattern

This works on the principle of many-to-one subscriber: publisher concept.

public interface Subject {
      public void addObserver(Observer ob);
      public void removeObserver(Observer ob);
      public void notifyObservers(Message msg);
}

public class WeatherStationBroadcasterSubject implements Subject {
     
      private Set<Observer> observerList = new HashSet<Observer>();

      @Override
      public void addObserver(Observer ob) {
            observerList.add(ob);
      }

      @Override
      public void removeObserver(Observer ob) {
            observerList.remove(ob);
      }

      @Override
      public void notifyObservers(Message msg) {
            Iterator<Observer> it = observerList.iterator();
            while(it.hasNext()) {
                  it.next().update(msg);
            }
      }

}

public interface Observer {
      public void update(Message msg);
}

public class MobileObserver implements Observer {

      @Override
      public void update(Message msg) {
            System.out.println("Mobile Phone Observer : Weather data changed :: "+msg.getMessage());
      }

}

public class SmartWatchObserver implements Observer {

      @Override
      public void update(Message msg) {
            System.out.println("Smart Watch Observer : Weather data changed :: "+msg.getMessage());
      }

}

public class Message {
     
      private String message;

      public Message(String message) {
            super();
            this.message = message;
      }

      public String getMessage() {
            return message;
      }

}

public class MainClass {

      public static void main(String[] args) {
            Subject subject = new WeatherStationBroadcasterSubject();
            Observer observer1 = new MobileObserver();
            subject.addObserver(observer1);
            Message msg = new Message("It's a hot day");
            subject.notifyObservers(msg);
            Observer observer2 = new SmartWatchObserver();
            subject.addObserver(observer2);
            msg = new Message("It's a cold day");
            subject.notifyObservers(msg);
            subject.removeObserver(observer1);
            msg = new Message("It's a cloudy day");
            subject.notifyObservers(msg);
      }

}

Result :

Mobile Phone Observer : Weather data changed :: It's a hot day
Mobile Phone Observer : Weather data changed :: It's a cold day
Smart Watch Observer : Weather data changed :: It's a cold day
Smart Watch Observer : Weather data changed :: It's a cloudy day


Code link : https://github.com/sksumit1/DesignPatterns


No comments:

Post a Comment